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

如何在MongoDB中使用文档和集合之间的关系,mongodb,database-design,mongoose,database-schema,database,Mongodb,Database Design,Mongoose,Database Schema,Database,我在集合objects\u parameters中有以下文档: { "_id" : ObjectId("5922ef07470e6cc50c3c987d"), "object_id" : "5922ef07470e6cc50c3c987c", "parameter_id" : "5922e986470e6cc60c3c987e", "value" : "5922e986470e6cc60c3c987e" } 如您所见,值字段包含(引用)来自参数集合的另一个文档的

我在集合
objects\u parameters
中有以下文档:

{
    "_id" : ObjectId("5922ef07470e6cc50c3c987d"),
    "object_id" : "5922ef07470e6cc50c3c987c",
    "parameter_id" : "5922e986470e6cc60c3c987e",
    "value" : "5922e986470e6cc60c3c987e"
}
如您所见,
字段包含(引用)来自
参数
集合的另一个文档的
\u id


如何使用该
字段绑定这两个集合?

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

但是,手动引用在本机上没有任何特殊的支持,因此您有两个选项来填充这些引用,我想这就是您在绑定这两个集合时的意思

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

  • 第二种选择,我认为更好,是依靠你选择的图书馆为你做这件事。我建议您查看一下是否使用Node.js

    Mongoose让您可以轻松定义文档之间的引用,并轻松填充它们,正如您看到的

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

除非您有充分的理由使用DBRefs,否则请改用手动引用

DBRefs示例:

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

{
    "_id" : ObjectId("5126bbf64aed4daf9e2ab771"),
    "text" : ...,
    "author" : {
        "$ref" : "authors",
        "$id" : ObjectId("5126bc054aed4daf9e2ab772"),
        "$db" : "users"
    }
}
{
    "_id" : ObjectId("5126bbf64aed4daf9e2ab771"),
    "text" : ...,
    "author" : ObjectId("5126bc054aed4daf9e2ab772")
}
只需查看该文档,您就知道
作者
数据的位置。您可以看到它存储在名为
users
的数据库中,存储在名为
authors
的集合中,并且它的
\u id
5126bc054aed4daf9e2ab772

手动参考示例:

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

{
    "_id" : ObjectId("5126bbf64aed4daf9e2ab771"),
    "text" : ...,
    "author" : {
        "$ref" : "authors",
        "$id" : ObjectId("5126bc054aed4daf9e2ab772"),
        "$db" : "users"
    }
}
{
    "_id" : ObjectId("5126bbf64aed4daf9e2ab771"),
    "text" : ...,
    "author" : ObjectId("5126bc054aed4daf9e2ab772")
}
因此,只要查看该文档,您就不知道在哪里可以找到填充
作者
字段所需的信息。这些信息现在将驻留在应用程序级别,尤其是当您选择使用此工具时,将驻留在Mongoose的模式定义中

性能说明:

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

嵌入/非规范化注释:


如果明智地嵌入文档并在需要时在其上建立索引,将为您带来更高的性能收益。

简而言之:您没有。你为什么要这样做?可能是@CodeCaster的重复我想他的意思是,当他说bind时,我们将如何填充这些引用。@Danziger在这种情况下,我的评论不会改变。谢谢你的努力,我必须一直阅读。有一句话,当我有collection
parameters
时,当一个参数是另一个参数的子参数时,如何存储关系等等。@blacar看一下: