我对MongoDB很新,并试图用它构建一个嵌套的注释系统。 在网上你找到了各种文件结构来实现这一目标,但我正在寻找一些能够让我轻松地通过评论完成以下工作的提案
除了通常显示评论之外。如果您对如何使用MongoDB处理这些事情有任何建议 - 或者 - 告诉我寻找替代方案,我们会非常感激!
答案 0 :(得分:2)
由于您需要通过某些属性,按用户等来检索注释,因此您无法在用户可以注释的每个对象中嵌入(嵌入对文档数据库来说总是更快)注释。因此,您需要为评论创建单独的集合。我建议遵循以下结构:
comment
{
_id : ObjectId,
status: int (spam =1, approved =2),
userId: ObjectId,
commentedObjectId: ObjectId,
commentedObjectType: int(for example question =1, answer =2, user =3),
commentText
}
通过以上结构,您可以轻松完成您想要的任务:
//Mark comments as spam/approved and retrieve comments by this attributes
//mark specific comment as spam
db.comments.update( { _id: someCommentId }, { status: 1 }, true);
db.comments.find({status : 1});// get all comments marked as spam
//Retrieve comments by user
db.comments.find({'_userId' : someUserId});
//Retrieve comment count for an object/user
db.comments.find({'commentedObjectId' : someId,'commentedObjectType' : 1 })
.count();
另外我想,对于评论,计数会更好地在每个对象中创建额外的字段,并在评论添加/删除时inc。
答案 1 :(得分:1)
您是否考虑将评论存储在需要参考的所有文档中?如果您有用户的文档,请将该用户的所有注释存储在其中。如果您有一个单独的对象文档,那么也存储所有注释。从一个关系世界来看,你试图获得给定数据的一个副本,然后通过ID引用它,但是即使对于关系数据库,如果你想要查询运行,你也必须开始复制数据快。
使用此设计,您加载的每个文档都将“完整”。它将拥有您需要的所有数据,并且该集合上的索引将保持快速读取。写入的价格会稍微慢一点,当您需要更新评论文本时更加令人头疼,因为您需要更新多个文档。