是否需要在父文档中持有对子代的引用 – Mongoose

在下面的例子中,我想检索填充相应注释的文档。 我是否需要将引用中的评论作为数组保存? 参照意见进行sorting意味着,每当更新新文档时,文档都会定期更新。

var Post = new schema({ content:String, author:{ type: Schema.ObjectId, ref: 'User' }, createdOn:Date }); var Comment = new Schema({ post : { type: Schema.ObjectId, ref: 'Post' }, commentText : String, author: { type: Schema.ObjectId, ref: 'User' }, createdOn:Date }); mongoose.model('Post',Post); mongoose.model('Comment',Comment); 

如果我在Post中将Comment._Id引用为数组,那么在mongoose中,我可以像下面那样填充。

 Post.findById(postid).populate('Comments').exec( callback); 

但是,我不想在创build新评论时更新发布文档,因为您需要将评论ID推送到发布文档中。 评论有引用它所属的post,所以从技术上讲,可以retirve属于一个特定的职位的意见,但如果你想检索或发送单个json文件有可能没有数组包含引用文章中的评论?

与数据build模一样,只有多种方式来处理优势/劣势。 通常,不止一种方式对您的应用程序来说已经足够了。

你所问的问题是典型的1:n关系,所以你可以:

  1. 存储从孩子到父母的backrefs
  2. 将父母的数组存储在孩子身上
  3. 通过做1和2存储双向参考。
  4. 将注释直接存储在后对象中,作为后文档内的子文档(注释对象)的数组。

这些都是正确的,有效的。 哪一个最好取决于你的使用情况 – 你的应用程序。 例子:

  • 如果您为一个post同时创build多个注释,那么1.可能是一个不错的select,因为您不需要同时更新post对象。 但是,您将始终需要两个查询来显示post及其评论。
  • 如果你没有发表任何评论,如果一个评论总是属于一个post,4.可能是一个不错的select – 可能是mongodb(一个没有sqlselect)的典型select。 – >只有一个查询显示带有评论的post。
  • 如果您的单篇文章有很多评论,并且对于您的performance来说只能载入一部分评论是非常重要的,4.是不好的select。
    1. 可能是最好的,如果你需要所有的灵活性,每当你无法预测的使用和性能不是一个问题。

进一步信息在这里: http : //docs.mongodb.org/manual/core/data-model-design/