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