MongoDB中的嵌套注释

时间:2011-03-10 16:27:43

标签: mongodb comments nested

我对MongoDB很新,并试图用它构建一个嵌套的注释系统。 在网上你找到了各种文件结构来实现这一目标,但我正在寻找一些能够让我轻松地通过评论完成以下工作的提案

  • 将评论标记为垃圾邮件/已批准并按此属性检索评论
  • 按用户检索评论
  • 检索对象/用户的评论计数

除了通常显示评论之外。如果您对如何使用MongoDB处理这些事情有任何建议 - 或者 - 告诉我寻找替代方案,我们会非常感激!

2 个答案:

答案 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引用它,但是即使对于关系数据库,如果你想要查询运行,你也必须开始复制数据快。

使用此设计,您加载的每个文档都将“完整”。它将拥有您需要的所有数据,并且该集合上的索引将保持快速读取。写入的价格会稍微慢一点,当您需要更新评论文本时更加令人头疼,因为您需要更新多个文档。