MongoDB中的嵌套注释

MongoDB中的嵌套注释,mongodb,comments,nested,Mongodb,Comments,Nested,我对MongoDB非常陌生,并试图用它构建一个嵌套的注释系统。 在网上,你可以找到各种各样的文档结构来实现这一点,但我正在寻找一些建议,使我能够轻松地用评论做以下事情 将评论标记为垃圾邮件/已批准,并通过此属性检索评论 按用户检索评论 检索对象/用户的注释计数 当然,除了像通常那样显示注释之外。如果您对如何使用MongoDB处理这些问题有任何建议,请告诉我寻找替代方案,我们将不胜感激 因为您需要按某些属性、按用户等检索注释,所以无法在用户可以注释的每个对象中嵌入注释(嵌入文档数据库的速度总是

我对MongoDB非常陌生,并试图用它构建一个嵌套的注释系统。 在网上,你可以找到各种各样的文档结构来实现这一点,但我正在寻找一些建议,使我能够轻松地用评论做以下事情

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

当然,除了像通常那样显示注释之外。如果您对如何使用MongoDB处理这些问题有任何建议,请告诉我寻找替代方案,我们将不胜感激

因为您需要按某些属性、按用户等检索注释,所以无法在用户可以注释的每个对象中嵌入注释(嵌入文档数据库的速度总是更快)。因此,您需要为注释创建单独的集合。我建议采用以下结构:

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();

此外,我认为对于注释计数,最好在每个对象中创建额外的字段,并在注释添加/删除时使用它。

您是否考虑过将注释存储在所有需要引用它们的文档中?如果您有该用户的文档,请在其中存储该用户的所有注释。如果有单独的对象文档,请将所有注释也存储在该文档中。在关系世界中,您试图只获取给定数据的一个副本,然后通过ID引用它,但即使使用关系数据库,如果希望查询快速运行,您也必须开始复制数据,这感觉有点不对


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

如果没有人能想出更好的方法,我会接受你的回答。我知道这将是一个嵌入与分离收集之间的决定,但我也在考虑解决方案,比如将注释嵌入文档中,并在文档中单独存储哪些文档被视为垃圾邮件等。另一个解决方案可能不是将它们嵌套在文档中,而是与它们一起存储一些具体化的路径……这也是一个不错的方法,因为每个解决方案都可能有相同数量的优点和缺点,而且对您来说也是+1!