node.js - 如何在 Mongoose 中构建多对多关系?

标签 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 的数组?

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

如果删除了一个组,我是否必须迭代每个事件才能删除引用?

最佳答案

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

嵌入与链接 每种方法都有优点和缺点。

嵌入: 您将其嵌套在文档内。

例如,您的文档可能如下所示

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

链接

在这里,您链接到一种外键。 Refer to docs

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

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

关于node.js - 如何在 Mongoose 中构建多对多关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13592801/

相关文章:

node.js - express .JS : how can I set response status by name rather than number?

arrays - MongoDB聚合匹配非空数组

node.js - 使用 MongoDB Atlas 时,mongo-go-driver 因服务器选择超时而失败

mongoose - npm install mongoose 失败(kerberos 和 bson 错误)

node.js - node_modules 打包失败(Webpack 或 Browserify)

node.js - MongoDB/Mongoose $pull(删除)子文档不起作用

node.js - 如何在 Node 中链接页面

node.js - Mongoose - 如何在 Mongoose 中的填充字段数组中选择特定对象?

javascript - Node.js : check if a property is absent from object

node.js - Mongoose throwing 在使用变量代替显式字符串时,必须指定字段错误