如何在 MongoDB 中使用文档与 collections 之间的关系

How to use relations between documents and collections in MongoDB

我在 collection objects_parameters 中有以下文档:

{
    "_id" : ObjectId("5922ef07470e6cc50c3c987d"),
    "object_id" : "5922ef07470e6cc50c3c987c",
    "parameter_id" : "5922e986470e6cc60c3c987e",
    "value" : "5922e986470e6cc60c3c987e"
}

如您所见,value 字段包含(引用)来自 parameters collection.

的另一个文档的 _id

如何使用那个 value 字段 绑定 这两个 collection?

有两种方法可以做到这一点,使用 Manual References, which you are already doing, or using DBRefs, which is just a convention for representing a document, but is supported by the MongoDB Drivers, as you can see in this example

然而,手动引用本身没有任何类型的特殊支持,因此您有两个选项来填充这些引用,我想这就是您绑定这两个集合的意思.

  • 第一个是直接从您的应用程序中使用 MongoDB 驱动程序手动执行此操作,即您查询一个或多个父文档,读取它们的引用,并查询附加的文件。然后,您可以将所有这些文档合并为 return 一个结果。

  • 第二种选择,我认为更好,是依靠您选择的图书馆来为您做这件事。如果您使用 Node.js.

    ,我建议您查看 Mongoose

    Mongoose 让您轻松定义文档之间的引用并轻松填充它们,如您所见 official docs.

我可能会选择 Manual References,因为我认为它更简洁并且不需要在数据库中存储与模式相关的信息(这需要 space),但这可能是个人喜好问题,虽然它也是推荐的选项:

Unless you have a compelling reason to use DBRefs, use manual references instead.

DBRefs 示例:

主要区别之一是使用 DBRefs 时,所有关系信息都存储在文档本身中,因此您可能有一个 posts 集合,其文档如下所示:

{
    "_id" : ObjectId("5126bbf64aed4daf9e2ab771"),
    "text" : ...,
    "author" : {
        "$ref" : "authors",
        "$id" : ObjectId("5126bc054aed4daf9e2ab772"),
        "$db" : "users"
    }
}

只需查看该文档,您就知道 author 数据所在的位置。您可以看到它存储在一个名为 users 的数据库中,在一个名为 authors 的集合中,并且它的 _id5126bc054aed4daf9e2ab772.

手册参考示例:

但是,如果您使用手册参考,则同一文档将如下所示:

{
    "_id" : ObjectId("5126bbf64aed4daf9e2ab771"),
    "text" : ...,
    "author" : ObjectId("5126bc054aed4daf9e2ab772")
}

因此,仅通过查看该文档,您无法知道在哪里可以找到填充 author 字段所需的信息。该信息现在将驻留在应用程序级别,在 Mongoose 的模式定义中,特别是如果您选择使用此工具。

性能说明:

在这两种情况下,您都会执行额外的请求来填充这些引用,因此 DBRefs 与手动引用相比,不会给您带来任何性能提升。

嵌入/反规范化注:

嵌入文档并在需要时在其上建立索引,如果做得明智并且 guarantees you have atomic operations, as MongoDB offers single-document atomicity.

会给您带来更多的性能提升