嵌入式文档与mongoose设计模型中的参考?

时间:2014-01-23 07:48:14

标签: javascript node.js mongodb express mongoose

假设我正在使用Node.js和mongoose构建一个讨论论坛。用户可以拥有多个论坛,论坛可以有多个评论。用户也可以邀请其他用户加入论坛。因此,我的问题是关于使用参考或嵌入文档的模型设计!

如果我使用嵌入式文档,它看起来像:

var Comment = new Schema({ ... });

var Forum = new Schema({
    title: {type: String},
    content: {type: String},
    comments: [Comment],
    attendees: [User]
});

var User = new Schema({
    name: {type: String},
    email: {type: String},
    forums: [Forum]
});

var Account = mongoose.model('Account', User);

使用上面的设计,我很挣扎:当用户在论坛中添加评论,并且该论坛在我的论坛中时,我认为我无法在论坛列表中获得新评论的更新。我呢?你知道如何让嵌入式文档在这种情况下工作吗?

因此,我想在mongoose中使用引用。在这种情况下,我将有两个集合:帐户论坛。在这种情况下,向论坛添加新评论不是问题。我是对的吗?

引用会比此应用的嵌入式文档更好吗?

提前致谢,

2 个答案:

答案 0 :(得分:35)

这主要取决于您将如何查询和更新数据。在这种情况下,一致性和文档大小也很重要。以下是引用或嵌入文档时的一个很好的总结:

嵌入:

  • 小子文档
  • 不经常更改的数据
  • 最终的一致性是可以接受的
  • 通过小额增长的文件
  • 您经常需要执行第二次查询才能获取的数据
  • 快速阅读

引用:

  • 大型子文档
  • 易变数据
  • 必须立即保持一致
  • 增长量大的文件
  • 您经常从结果中排除的数据
  • 快速写入

这是我读过的一本关于mongo的书的摘录。这些只是一般规则,但根据我的经验,使用它们使得很容易引用或嵌入大部分时间。

在这种情况下,我宁愿参考论坛。但请考虑您的所有要求。例如,如果您从用户引用论坛,并且您需要查询特定论坛的所有用户,则在这种情况下查询可能会很慢。如果我是你,我会列出我需要的所有内容,然后使用一般规则将在嵌入和引用的优缺点之间找到平衡。

希望它有所帮助!

答案 1 :(得分:4)

我个人喜欢在像你这样的情况下做引用。通过这种方式,我可以从用户,来自论坛的用户,来自评论的论坛,来自用户的论坛等获得评论,而无需担心进行复杂的嵌入式文档查询。我甚至不打扰存储嵌入式参考文档。如果论坛和评论之间存在一对多的关系,那么我会在论坛上存储一个论坛参考,而论坛上没有评论参考,因为当您从评论集合中添加/删除评论时,您还必须去除嵌入来自论坛评论集的参考文件。

我可以使用论坛参考从评论中查询论坛,我可以通过查询该论坛参考的评论集合获取论坛的所有评论(这只是一个ID号,直到mongoose为你填充幕后)。