node.js - 在 MongoDB 中相互引用两个集合文档

标签 node.js mongodb mongoose mongodb-query aggregation-framework

是否可以使用 ref 相互引用 2 个文档?如果可以,是否建议这样做?这是一个好的做法吗?像这样:

FirstDocumentId 集合的模型:

const FirstDocumentId = mongoose.model(
    'FirstDocumentId',
    new mongoose.Schema({
        coolField: String,
        secondDocumentId: {type: Mongoose.Schema.Types.ObjectId, ref: 'secondDocumentId'}
    })
);

SecondDocumentId 集合的模型:

const SecondDocumentId = mongoose.model(
    'SecondDocumentId',
    new mongoose.Schema({
        someField: String,
        firstDocumentId: {type: Mongoose.Schema.Types.ObjectId, ref: 'firstDocumentId'}
    })
);

这样做的目的是创建一对一的关系并能够轻松访问两个文档。

我知道我可以只引用 1,而不将第二个引用到第一个,但我认为修改它们会更简单。

最佳答案

是的,您可以像您正在做的那样将一个集合引用到另一个集合,理想情况下这就是 MongoDB 中维护两个集合之间的关系的方式,但您需要理解,因为 MongoDB 是无模式的,没有直接的方法来创建通过创建/更新/删除第一个集合中的相关文档来更新/删除第二个集合中的文档(集合及其文档是独立的 - 操作在文档级别是原子的)。由于没有直接的方法 - 您必须编写应用程序逻辑或某种批处理作业或 MongoDB-stitch达到引用维护的目的。

  1. 但是如果你问为什么要维护? - 正如您可能熟悉 SQL 中的JOINS,通过这种方式,我们可以使用引用很好地进行读取。
  2. 那又如何呢? - MongoDB 有聚合框架,对于查询数据库来说非常强大,在聚合中有一个名为 $lookup 的运算符这对于JOINS很有帮助。为此,您保留了引用文献。您还可以查看$graphLookup .
  3. 我必须使用引用吗? - 正如我已经讨论过的,$lookup 是一个有用的运算符 - 因此,通过使用它,您不需要为这些字段提及 ref。如果您使用 mongo shell 或任何客户端(例如 robo3Tmongo compass)或任何 native 驱动程序(例如 mongodb 驱动程序)对于node.js,您可以使用 native $lookup。即使你可以在使用 mongoose 时使用查找,但 mongoose 声称它们已经 .populate()与 native $lookup 相比,它非常强大,要使用它,您将使用 ref。除此之外,它没有任何用处,即使具有相同的模型,您也可以将 $lookup 与 mongoose 一起使用,而不是使用 populate。
  4. 引用字段 - 因此您不限于 _id 字段,您实际上可以引用任何字段,但两个集合中的值和类型应匹配,这样查询时会很容易否则每次查询时都需要将一种转换为另一种,因此写入时要小心。
  5. 我是否需要在两个集合中维护引用 - 不一定需要,一开始似乎很容易或没问题,但当你的集合最终增长时,维护引用将是一项艰巨的任务 - 您可能需要写入/删除/每次更新两个集合,其中需要构建索引,文档大小/集合大小可能会增长,因此最好根据查询需求维护引用。查看有关数据设计的文档:data-modeling .

关于node.js - 在 MongoDB 中相互引用两个集合文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60292299/

相关文章:

node.js - 问:所有的 promise 和一系列的 promise 似乎都不起作用

database - 如何在 mongoDB 中使用数组进行查找

java - 计算文档中字段的数量 mongo Java

node.js - 如何在 Mongoose 查询中设置限制、偏移、跳过

Mongodb - 如何在查找查询中使用聚合文本搜索

javascript - Mysql-nodejs 嵌套查询

javascript - 如何从终端读取的最佳方法?卡蒂斯数星星

node.js - 尝试上传到 AWS S3 时无法加载任何提供商的凭证

mongodb - mongodb 3.0 是否增加了他们的 Key Index Limit?

javascript - Mongoose 多对多