Database References数据库引用
On this page本页内容
For many use cases in MongoDB, the denormalized data model where related data is stored within a single document is optimal. 对于MongoDB中的许多用例,将相关数据存储在单个文档中的非规范化数据模型是最佳的。However, in some cases, it makes sense to store related information in separate documents, typically in different collections or databases.然而,在某些情况下,将相关信息存储在单独的文档中是有意义的,通常存储在不同的集合或数据库中。
You can use the 可以使用$lookup
pipeline stage to perform a left outer join to an unsharded collection in the same database.$lookup
管道阶段对同一数据库中的未排序集合执行左外部联接。
You can also use the 您还可以使用$graphLookup
pipeline stage to join an unsharded collection to perform recursive search.$graphLookup
管道阶段加入未排序的集合以执行递归搜索。
This page outlines alternative procedures that predate the 本页概述了$lookup
and $graphLookup
pipeline stages.$lookup
和$graphLookup
管道阶段之前的替代过程。
MongoDB applications use one of two methods to relate documents:MongoDB应用程序使用以下两种方法之一来关联文档:
Manual references手册参考资料save the将一个文档的_id
field of one document in another document as a reference._id
字段保存到另一个文档中作为引用。Your application runs a second query to return the related data. These references are simple and sufficient for most use cases.您的应用程序运行第二个查询以返回相关数据。这些引用对于大多数用例来说都是简单而充分的。- DBRefs
are references from one document to another using the value of the first document's是使用第一个文档的_id
field, collection name, and, optionally, its database name, as well as any other fields._id
字段、集合名称(可选)及其数据库名称以及任何其他字段的值从一个文档到另一个文档的引用。DBRefs allow you to more easily reference documents stored in multiple collections or databases.DBRef允许您更容易地引用存储在多个集合或数据库中的文档。
To resolve DBRefs, your application must perform additional queries to return the referenced documents. 若要解析DBRef,应用程序必须执行附加查询以返回引用的文档。Some MongoDB drivers provide helper methods to enable DBRefs to be resolved into documents, but it doesn't happen automatically.一些MongoDB驱动程序提供了帮助方法,使DBRef能够解析为文档,但这并不是自动发生的。
DBRefs provide a common format and type to represent relationships among documents. The DBRef format also provides common semantics for representing links between documents if your database must interact with multiple frameworks and tools.DBRef提供了一种通用的格式和类型来表示文档之间的关系。如果数据库必须与多个框架和工具交互,DBRef格式还提供了表示文档之间链接的通用语义。
Unless you have a compelling reason to use DBRefs, use manual references instead.除非您有充分的理由使用DBRef,否则请使用手动参考。
Manual References手册参考资料
Background背景
A manual reference is the practice of including one document's 手动参考是将一个文档的_id
field in another document. _id
字段包含在另一个文档中的做法。The application can then issue a second query to resolve the referenced fields as needed.然后,应用程序可以根据需要发出第二个查询来解析引用的字段。
Process过程
Consider the following operation to insert two documents, using the 考虑以下操作来插入两个文档,使用第一个文档的_id
field of the first document as a reference in the second document:_id
字段作为第二个文档中的引用:
original_id = ObjectId()
db.places.insertOne({
"_id": original_id,
"name": "Broadway Center",
"url": "bc.example.net"
})
db.people.insertOne({
"name": "Erin",
"places_id": original_id,
"url": "bc.example.net/Erin"
})
Then, when a query returns the document from the 然后,当查询从people
collection you can, if needed, make a second query for the document referenced by the places_id
field in the places
collection.people
集合返回文档时,如果需要,您可以对places
集合中的places_id
字段引用的文档进行第二次查询。
Use使用
For nearly every case where you want to store a relationship between two documents, use manual references. 对于几乎所有想要存储两个文档之间关系的情况,都可以使用手动引用。The references are simple to create and your application can resolve references as needed.引用创建起来很简单,应用程序可以根据需要解析引用。
The only limitation of manual linking is that these references do not convey the database and collection names. 手动链接的唯一限制是这些引用不传递数据库和集合名称。If you have documents in a single collection that relate to documents in more than one collection, you may need to consider using DBRefs.如果单个集合中有与多个集合中的文档相关的文档,则可能需要考虑使用DBRef。
DBRefs
Background背景
DBRefs are a convention for representing a document, rather than a specific reference type. DBRef是表示文档的约定,而不是特定的引用类型。They include the name of the collection, and in some cases the database name, in addition to the value from the 除了_id
field._id
字段中的值之外,它们还包括集合的名称,在某些情况下还包括数据库名称。
Optionally, DBRefs can include any number of other fields. DBRef可以包括任意数量的其他字段(可选)。Extra field names must follow any rules for field names imposed by the server version.额外的字段名称必须遵循服务器版本对字段名称的任何规则。
Format总体安排
DBRefs have the following fields:DBRef具有以下字段:
$ref
-
The$ref
field holds the name of the collection where the referenced document resides.$ref
字段包含引用文档所在的集合的名称。
$id
-
The$id
field contains the value of the_id
field in the referenced document.$id
字段包含被引用文档中_id
字段的值。
$db
-
Optional.可选。Contains the name of the database where the referenced document resides.包含引用文档所在的数据库的名称。
DBRef documents resemble the following document:DBRef文档类似于以下文档:
{ "$ref" : <value>, "$id" : <value>, "$db" : <value> }
Consider a document from a collection that stored a DBRef in a 考虑一个集合中的文档,该文档将DBRef存储在creator
field:creator
字段中:
{
"_id" : ObjectId("5126bbf64aed4daf9e2ab771"),
// .. application fields
"creator" : {
"$ref" : "creators",
"$id" : ObjectId("5126bc054aed4daf9e2ab772"),
"$db" : "users",
"extraField" : "anything"
}
}
The DBRef in this example points to a document in the 本例中的DBRef指向creators
collection of the users
database that has ObjectId("5126bc054aed4daf9e2ab772")
in its _id
field. users
数据库的creators
集合中的一个文档,该文档的_id
字段中有ObjectId("5126bc054aed4daf9e2ab772")
。It also contains an optional field.它还包含一个可选字段。
The order of fields in the DBRef matters, and you must use the above sequence when using a DBRef.DBRef中字段的顺序很重要,使用DBRef时必须使用以上顺序。
Driver Support for DBRefsDBRef的驱动程序支持
C | ||
---|---|---|
C++ | ||
C# | ||
Go | ||
Haskell | ||
Java | ||
Node.js | ||
Perl | ||
PHP | ||
Python | ||
Ruby | ||
Scala |
Use使用
In most cases you should use the manual reference method for connecting two or more related documents. 在大多数情况下,您应该使用手动引用方法来连接两个或多个相关文档。However, if you need to reference documents from multiple collections, consider using DBRefs.但是,如果需要引用多个集合中的文档,请考虑使用DBRef。