【问题标题】:Nested Comments in MongoDBMongoDB 中的嵌套注释
【发布时间】:2011-07-12 20:53:40
【问题描述】:

我对 MongoDB 很陌生,并试图用它构建一个嵌套的评论系统。 在网上,您可以找到各种文档结构来实现这一目标,但我正在寻找一些建议,使我能够轻松地使用 cmets 执行以下操作

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

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

【问题讨论】:

    标签: mongodb comments nested


    【解决方案1】:

    由于您需要按某些属性、用户等检索 cmets,因此您不能在用户可以评论的每个对象中嵌入(文档数据库的嵌入总是更快)评论。因此,您需要为 cmets 创建单独的集合。我建议以下结构:

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

    另外我认为 cmets 计数会更好地在每个对象中创建额外的字段,并在评论添加/删除时 inc 它。

    【讨论】:

    • 如果没有人提出更好的建议,我会接受你的回答。我知道这将是嵌入与单独收集之间的决定,但我也在考虑诸如将 cmets 嵌入文档中并在文档中单独存储哪些文档被视为垃圾邮件等解决方案。另一个解决方案可能是不嵌套它们在文档中,但与它们一起存储了一些物化路径...
    【解决方案2】:

    您是否考虑过将 cmets 存储在所有需要引用它们的文档中?如果您有该用户的文档,请将该用户的所有 cmets 存储在其中。如果您有单独的对象文档,请将所有 cmets 也存储在那里。来自关系世界后感觉有点不对劲很快。

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

    【讨论】:

    • 也是一个不错的方法,因为每个解决方案都可能有相同数量的优点和缺点,也为您 +1!
    猜你喜欢
    • 2013-05-18
    • 1970-01-01
    • 2015-01-27
    • 2011-10-11
    • 2010-11-22
    • 2014-10-12
    • 1970-01-01
    • 2013-08-11
    • 2012-01-17
    相关资源
    最近更新 更多