gpt4 book ai didi

mongodb - 如何在 MongoDB 中使用文档和集合之间的关系

转载 作者:可可西里 更新时间:2023-11-01 10:02:33 25 4
gpt4 key购买 nike

我在集合 objects_parameters 中有以下文档:

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

如您所见,value 字段包含(引用)parameters 集合中另一个文档的 _id

如何使用 value 字段绑定(bind)这两个集合?

最佳答案

有两种方法可以做到这一点,使用 Manual References ,你已经在做,或者使用 DBRefs ,这只是表示文档的约定,但受 MongoDB 驱动程序支持,如您在 this example 中所见。 .

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

  • 第一种方法是直接从您的应用程序中使用 MongoDB 驱动程序手动执行此操作,即查询一个或多个父文档,读取它们的引用,并查询其他文档。然后,您可以将所有这些文档合并在一起以返回一个结果。

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

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

我可能会选择 Manual References,因为我认为它更简洁,而且不需要在数据库中存储与 schema 相关的信息(这会占用空间),但这可能是个人喜好的问题,尽管这也是推荐的选项:

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"
}
}

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

手册引用示例:

但是,如果您使用手动引用,则同一文档将如下所示:

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

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

性能说明:

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

嵌入/非规范化注释:

如果需要,嵌入文档并在其上建立索引将给您带来更多的性能提升,如果做得明智的话 guarantees you have atomic operations, as MongoDB offers single-document atomicity .

关于mongodb - 如何在 MongoDB 中使用文档和集合之间的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44114967/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com