是否有必要在父文件中保留对孩子的引用-Mongooose

时间:2015-08-20 19:06:03

标签: node.js mongodb mongoose

在下面的示例中,我想检索填充了相应注释的帖子文档。

我是否需要将帖子中的评论引用作为数组?参考注释保持数组意味着每当更新新文档时,帖子文档将定期更新。

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

但是我不想在创建新评论时更新帖子文档,因为您需要将评论ID推送到帖子文档中。注释引用了它所属的Post,因此从技术上讲,可以检索属于特定帖子的注释,但是如果要检索或发送单个json文档,是否可能没有包含对帖子文档中的注释的引用的数组?

1 个答案:

答案 0 :(得分:1)

与数据建模一样,只有多种方法可以利用优势/劣势来做事。通常不止一种方式足以满足您的应用。

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

  1. 将儿童的背景存储为父级
  2. 将父级的引用数组存储到子级
  3. 通过执行1.和2来存储双向引用。
  4. 将评论直接存储在post对象中,作为post-document中的子文档(comment-objects)数组。
  5. 这些都是正确的并且有效。哪一个最好取决于您的使用 - 您的应用程序。例子:

    • 如果你有很多并发创建一个帖子的评论,那么1.可能是一个不错的选择,因为你不需要同时更新帖子对象。但是,您将始终需要两个查询来显示带有注释的帖子。
    • 如果你从未在没有帖子的情况下显示评论,并且如果一条评论总是属于一个帖子,那么4.可能是一个不错的选择 - 可能是mongodb的典型选择(无选择)。 - >只有一个查询可以显示带评论的帖子。
    • 如果您的帖子中包含大量评论,并且您的效果只能加载一部分评论非常重要,那么这是一个糟糕的选择。
      1. 可能是最好的,如果你需要所有的灵活性,只要你无法预测使用和性能不是问题。

    此处的更多信息: http://docs.mongodb.org/manual/core/data-model-design/