如何在猫鼬中建立多对多的关系?

时间:2012-11-27 20:49:49

标签: node.js mongodb mongoose

在我的应用中,用户拥有事件和群组 - 事件可以(但不是必须)属于群组。我还是非关系数据库的新手,所以我想知道最佳实践的最佳实践。

    var user = new mongoose.Schema({
        name: { type: String },
        events: [event],
        groups: [group]
    });

    var group = new mongoose.Schema({
        name: { type: String }
    });

这是我很困惑的地方。

    var event = new mongoose.Schema({
        name: { type: String }
        groups: ????
    });

我是否只保留一个数组,其中包含对组ID的引用?

如果我这样做,我将如何按群组查找事件?

如果删除了一个组,我是否必须遍历每个事件以删除引用?

1 个答案:

答案 0 :(得分:5)

在mongodb,你有两个选择。嵌入(子文档)与链接(另一个集合)

嵌入Vs链接 每种方法都有利弊。

<强>嵌入: 您将其嵌入文档中。

例如,

您的文档可能看起来像

{
    name : 'name',
    events: [a,b,c],
    groups: [1,2,3]
}
  • 你获得了原子性,因为只涉及一个集合。
  • 但是,值可能重复

<强>链接

在这里,您可以使用一种外键进行链接。 Refer to docs

一个集合中的文档将引用另一个集合中的文档。 缺点是你失去原子操作。但是,您可以消除重复。

如果要更新组并更新事件,并且它们位于不同的集合中,则必须自己处理原子更新。 Mongodb不会为您保证。