在mongoose模式中构造多对多模型的最佳方法是什么?
我有两个模型,它们之间有多对多的关系,用户可以属于多个组织,而组织可以有多个用户。
选项:
1.通过引用其他模型来定义每个模型中的关系
1.通过引用另一个模型来定义一个模型中的关系
备选案文1
const UserSchema = new Schema({
organiations: { type: Schema.Types.ObjectId, ref: "Organiation" }, // references organisation
})
mongoose.model("User", UserSchema)
const OrganiationSchema = new Schema({
users: { type: Schema.Types.ObjectId, ref: "User" }, // references users
})
mongoose.model("Organiation", OrganiationSchema)
字符串
这似乎是一个好主意,首先,它意味着我可以查询组织模型以获得所有用户,我也可以查询用户模型以获得所有相关组织。
唯一的问题是我必须维护两个真实的来源。如果我创建一个组织,我必须用它所属的组织更新用户,我必须用它拥有的用户更新组织。
这让我想到了选项2,即通过只在一个模型中定义关系来获得一个真理来源。
备选方案2:
const UserSchema = new Schema({
organiations: { type: Schema.Types.ObjectId, ref: "Organiation" }, // references organistion
})
mongoose.model("User", UserSchema)
const OrganiationSchema = new Schema({}) // no referencces
mongoose.model("Organiation", OrganiationSchema)
型
这意味着当我创建一个新的组织时,我只需要更新用户与他们所属的组织。没有2个来源不同步的风险。然而,这确实意味着当涉及到查询数据时,它使它变得更加棘手。如果我想获得属于一个组织的所有用户,我必须查询用户文档。这意味着我的组织控制器必须同时了解用户和组织模型,当我开始添加更多的关系和模型时,我在所有这些模块之间得到了我想避免的紧耦合。
您建议如何处理mongoose模式中的多对多关系?
2条答案
按热度按时间afdcj2ne1#
对此没有固定的解决办法。
如果组织可以拥有比用户可以拥有的组织多几个数量级的用户,则选项2可能是更好的解决方案。
性能方面,只要引用的id被索引,填充引用的数据就差不多了。
话虽如此,你可能仍然会选择选项1,即使你的组织集合有可能有“巨大”的数组。特别是如果你想做简单的计算,如组织用户的数量或使用“组织的当前userIds到其他一些集合”。在这种情况下,选项1会更好。
但是如果你选择了选项1,并且你的数组有可能变得非常大,考虑桶设计模式。基本上你限制了嵌套数组的最大长度。如果数组达到了它的最大长度,你就创建另一个文档来保存新添加的id(或嵌套文档)。把它看作是分页。
ajsxfq5m2#
你只能有一个真值来源,就像你在解决方案2中提到的那样,但是对于查询,你可以对另一边使用virtual populate:
字符串
然后你可以在查询中填充
users
:型