如何在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
时,关系的所有信息都存储在文档本身中,因此您可能有一个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看一下: