如何在 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
的集合中,并且它的 _id
是 5126bc054aed4daf9e2ab772
.
手册参考示例:
但是,如果您使用手册参考,则同一文档将如下所示:
{
"_id" : ObjectId("5126bbf64aed4daf9e2ab771"),
"text" : ...,
"author" : ObjectId("5126bc054aed4daf9e2ab772")
}
因此,仅通过查看该文档,您无法知道在哪里可以找到填充 author
字段所需的信息。该信息现在将驻留在应用程序级别,在 Mongoose 的模式定义中,特别是如果您选择使用此工具。
性能说明:
在这两种情况下,您都会执行额外的请求来填充这些引用,因此 DBRefs
与手动引用相比,不会给您带来任何性能提升。
嵌入/反规范化注:
嵌入文档并在需要时在其上建立索引,如果做得明智并且 guarantees you have atomic operations, as MongoDB offers single-document atomicity.
会给您带来更多的性能提升
我在 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.
,我建议您查看 MongooseMongoose 让您轻松定义文档之间的引用并轻松填充它们,如您所见 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
的集合中,并且它的 _id
是 5126bc054aed4daf9e2ab772
.
手册参考示例:
但是,如果您使用手册参考,则同一文档将如下所示:
{
"_id" : ObjectId("5126bbf64aed4daf9e2ab771"),
"text" : ...,
"author" : ObjectId("5126bc054aed4daf9e2ab772")
}
因此,仅通过查看该文档,您无法知道在哪里可以找到填充 author
字段所需的信息。该信息现在将驻留在应用程序级别,在 Mongoose 的模式定义中,特别是如果您选择使用此工具。
性能说明:
在这两种情况下,您都会执行额外的请求来填充这些引用,因此 DBRefs
与手动引用相比,不会给您带来任何性能提升。
嵌入/反规范化注:
嵌入文档并在需要时在其上建立索引,如果做得明智并且 guarantees you have atomic operations, as MongoDB offers single-document atomicity.
会给您带来更多的性能提升