我正在研究Meteor中的笔记应用程序原型;功能要求包括:
鉴于上述情况,每个文档都有一个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
键来区分共享注释和用户注释:
parent : null
代表“顶级”,共享笔记parent : "yG8xrh6KiZXv7e8MD"
的内容,指回用户注释的“顶级”注释或子文档。 (希望这是有道理的)。 两个问题。首先 - 这是一个有效的设计吗?
如果它是有效的设计,我如何引用特定的子文档?例如,在上面的文档中,如果用户只想在第2节中添加符号?我可以在子文档中添加_id
,然后在符号文档中使用该值作为parent
键吗?
答案 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;
}
});