【问题标题】:Is it necessary hold references to children in parent document -Mongooose是否有必要在父文档中保留对子项的引用 -Mongoose
【发布时间】:2018-11-11 18:08:37
【问题描述】:

在下面的示例中,我想检索填充了相应 cmets 的 post 文档。

我是否需要将帖子中对 cme​​ts 的引用保存为数组?参考 cmets 持有数组意味着无论何时更新新文档,都会定期更新发布文档。

 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 推送到帖子文档中。 Comment 引用了它所属的 Post,因此从技术上讲,可以检索属于特定帖子的 cmets,但是如果您想检索或发送单个 json 文档,是否可以在 post 文档中没有包含对 cme​​ts 的引用的数组?

【问题讨论】:

  • 是的,但是您需要两个查询。查询您的帖子和查询您的所有 cmets。然后你将不得不返回两个结果:)
  • 谢谢托马斯,是的,我猜这就是前进的方向。

标签: node.js mongodb mongoose


【解决方案1】:

与数据建模一样,只有多种方法可以做事,各有优缺点。对于您的应用来说,通常不止一种方法就足够了。

您提出的问题是典型的 1:n 关系,因此您可以:

  1. 存储从子级到父级的反向引用
  2. 在父节点上存储一组引用给子节点
  3. 通过执行 1. 和 2 存储双向引用。
  4. 将 cmets 直接存储在 post 对象中,作为 post-document 中的子文档(comment-objects)数组。

这些都是正确的并且有效。哪个最好真的取决于您的使用情况——您的应用程序。例子:

  • 如果您有很多并发创建一个帖子的 cmets,那么 1. 可能是一个不错的选择,因为您不需要同时更新帖子对象。但是您总是需要两个查询来显示带有 cmets 的 Post。
  • 如果您永远不会在没有帖子的情况下显示评论,并且如果一个评论总是完全属于一个帖子,那么 4. 可能是一个不错的选择 - 可能是 mongodb 的典型选择(无 sql 选择)。 -> 只有一个查询才能显示带有 cmets 的帖子。
  • 如果您有包含大量 cmets 的单个帖子,并且能够仅加载 cmets 的子集对您的性能很重要,那么 4. 是一个糟糕的选择。
    1. 可能是最好的,如果您需要所有的灵活性,只要您无法预测使用情况并且性能不是问题。

更多信息在这里: http://docs.mongodb.org/manual/core/data-model-design/

【讨论】:

  • 谢谢雷托。这非常有用。我觉得选项 1 对我来说可能是更好的选择。关于选项 2 和 3,我觉得它仍然需要两个查询。即使使用了猫鼬填充,在幕后,当启用调试时,我发现它会触发两个查询。我希望猫鼬在使用选项时填充选项。选项 4 ,我倾向于不使用,因为 cmets 会增加文档大小,如果多个用户正在更新文档,则会影响性能。
  • 你是对的,2 和 3 需要 2 次查询。填充发生在 node.js 代码中。所以我同意 1 或 4 更适合您的情况:1 优化写入性能,4 优化读取性能。因此,如果您有大量“一次写入”、“多次读取”数据,则使用 4。如果您有大量很少读取的写入(如日志类型应用程序),那么肯定使用 1。
  • 我还要补充一点,需要考虑文档的大小。 4. 如果您希望进行长时间的讨论,可能不是一个选择。
猜你喜欢
  • 2018-02-02
  • 1970-01-01
  • 1970-01-01
  • 2018-02-02
  • 2016-11-08
  • 2015-02-28
  • 2015-04-27
  • 2012-12-24
  • 1970-01-01
相关资源
最近更新 更多