Meteor / MongoDB参考另一个文档中的特定子文档

时间:2018-01-08 18:36:50

标签: mongodb meteor

我正在研究Meteor中的笔记应用程序原型;功能要求包括:

  1. 用户可以访问共享笔记
  2. 备注包含不同的部分
  3. 每个用户都需要能够在注释/部分中添加注释
  4. 符号可以随时间保留(例如,添加到现有符号而不更新或删除以前创建的符号)
  5. 用户之间的标记应该是私密的
  6. 鉴于上述情况,每个文档都有一个data键,其中包含子文档数组 - 注释的每个部分。像这样:

    { 
        "_id" : ObjectId("someObjectID"),
        "owner" : "Q5mpJZnAtFN5EMWT9",
        "createdAt" : "2018-01-05T22:56:03.257Z",
        "updatedAt" : "2018-01-06T12:07:03.123Z",
        "parent" : null,
        "title" : "Note Title",
        "data" : [
            {
                "date" : "2018-01-05T22:56:03.257Z",
                "title" : "Section 1 Title", 
                "text" : "Section content goes here..."
            },
            {
                "date" : "2018-01-05T22:56:03.257Z",
                "title" : "Section 2 Title", 
                "text" : "Section content goes here..."
            }
        ]
    }
    

    对于主要注释文档,data数组将这些部分存储为子文档;对于用户表示法,data数组将其个人表示法存储为子文档。我的想法是使用parent键来区分共享注释和用户注释:

    1. parent : null代表“顶级”,共享笔记
    2. 类似parent : "yG8xrh6KiZXv7e8MD"的内容,指回用户注释的“顶级”注释或子文档。 (希望这是有道理的)。
    3. 两个问题。首先 - 这是一个有效的设计吗?

      如果它是有效的设计,我如何引用特定的子文档?例如,在上面的文档中,如果用户只想在第2节中添加符号?我可以在子文档中添加_id,然后在符号文档中使用该值作为parent键吗?

1 个答案:

答案 0 :(得分:1)

这不是完整的解决方案,只是一个例子:

我会这样做的。我稍微修改了您的文档,在每个部分添加了符号字段:

{ 
    "_id" : ObjectId("someObjectID"),
    "owner" : "Q5mpJZnAtFN5EMWT9",
    "createdAt" : "2018-01-05T22:56:03.257Z",
    "updatedAt" : "2018-01-06T12:07:03.123Z",
    "parent" : null,
    "title" : "Note Title",
    "data" : [
        {
            "date" : "2018-01-05T22:56:03.257Z",
            "title" : "Section 1 Title", 
            "text" : "Section content goes here...",
            "notations": [
                 {
                    _id: "some id",
                    version:1
                    userId: "fsajksffhj",
                    date: "2018-01-05T22:56:06",
                    note: "some note about this sectioon"
                },
                 {
                    _id: "some id2",
                    version:1,
                    userId: "fsajksffhj",
                    date: "2018-01-05T22:56:06",
                    note: "some note about this sectioon"
                },
                 {
                    _id: "some id1",
                    version:1,
                    userId: "fsajksffhj",
                    date: "2018-02-06T00:56:06",
                    note: "edited the first notation"
                }

            ]
        },
        {
            "date" : "2018-01-05T22:56:03.257Z",
            "title" : "Section 2 Title", 
            "text" : "Section content goes here..."
        }
    ]
}
  用户之间的

符号应该是私密的

这是更难的部分。我使用Meteor Methods来做到这一点。另一种方法是使用MongoDB的聚合功能,再次匹配,展开,重新匹配,分组和创建文档。如果使用其中任何一种,您正在使用反应性。

Meteor.methods({
    'notes.singleNote: function(noteId, notationsUserId) {
      check(noteId, String);
      check(notationsUserId);

      let note = Notes.findOne(noteId);

      // remove other users' notations
      note.data = note.data.map(function(data) {
          if (data.notations) {
              data.notations = data.notations.filter(function(d) {
                  return d.userId === notationsUserId;
              });
          }
          return data
      });
});


return note;

}
});