对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。

数据库引用:手动引用和 DBRefs

对于大多数MongoDB使用案例,非规范化数据模型会将相关数据存储在单个文档中。在某些情况下,您需要将相关信息存储在单独的文档中,通常是不同的集合或数据库中。

重要

您可以使用 $lookup 管道阶段对同一数据库中的未分片集合执行左外连接。

您还可以使用 $graphLookup 管道阶段连接未分片集合,以执行递归搜索。

本页概述了在 $lookup 和 $graphLookup 管道阶段之前的替代程序。

MongoDB 应用程序使用两种方法之一来关联文档:

  • 手动引用将一个文档的 _id 字段保存在另一个文档中作为引用。应用程序会运行第二个查询以返回相关数据。手动引用适用于大多数使用案例,通常应优先于 DBRefs 使用。

  • DBRef 是指从一个文档到另一文档的引用,它们会使用第一个文档的 _id 字段的值、集合名称、数据库名称(可选)以及任意其他字段。除非您的应用程序明确需要使用 DBRef,否则请改用手动引用。

手动引用在另一个文档中包含一个文档的 _id字段。然后,应用程序可以根据需要运行第二个查询来解析引用的字段。

要在 MongoDB Atlas UI 中创建手动引用,请完成以下步骤:

1
  1. 如果尚未显示,请从导航栏上的 Organizations 菜单中选择包含所需项目的组织。

  2. 如果尚未显示,请从导航栏的 Projects 菜单中选择您的项目。

  3. 在侧边栏中,单击 Database 标题下的 Clusters。

    会显示集群页面。

2
  1. 对于要添加数据库引用的集群,单击 Browse Collections。

  2. 在左侧导航窗格中,选择数据库。

  3. 在左侧导航窗格中,选择该集合。此示例会引用 places 集合。

3
  1. 单击 Insert Document(连接)。

  2. 单击 JSON 视图图标({{}})。

  3. 将以下数据粘贴到文档中:

    { "_id": { "$oid": "651aea5870299b120736f442" }, "name": "Broadway Center", "url": "bc.example.net"}
  4. 单击 Insert(连接)。

4
  1. 在左侧导航窗格中,选择其他集合。此示例引用 people 集合。

  2. 单击 Insert Document(连接)。

  3. 单击 JSON 视图图标({{}})。

  4. 将以下数据粘贴到文档中:

    { "_id": { "$oid": "651aebeb70299b120736f443" }, "name": "Erin", "places_id": { "$oid": "651aea5870299b120736f442" }, "url": "bc.example.net/Erin"}
  5. 单击 Insert(连接)。

    当查询从 people 集合返回文档时,您可以根据需要从 places 集合中筛选查询结果,以查找 places_id 字段引用的文档。

    要了解在 MongoDB Atlas 中运行查询的更多信息,请参阅 MongoDB Atlas 文档中的查看、过滤文档以及对其进行排序。

比如说,以下操作会插入两个文档,使用第一个文档的 _id 字段作为第二个文档中的引用:

const original_id = db.movies.insertOne({ title: "Reference Demo Film 2099"}).insertedId db.comments.insertOne({ name: "Reference Demo Viewer", movie_id: original_id, text: "A thrilling adventure set in the future."})

要检索 movie_id 字段引用的文档,请在 movies 集合中对该文档进行第二次查询:

db.comments.findOne( { movie_id: original_id }, { name: 1, text: 1, _id: 0 })
{ name: 'Reference Demo Viewer', text: 'A thrilling adventure set in the future.'}

对于要存储两个文档之间关系的几乎所有情况,均请使用手动引用。它们创建起来很简单,应用程序可以根据需要解决它们。

DBRef 是一种表示文档的规则,而不是一种特定的引用类型。除了_id字段中的值,它们还包括集合的名称,在某些情况下还包括数据库名称。

或者,DBRef 可以包含任意数量的其他字段。额外字段名称必须遵循服务器版本规定的字段名称规则。

要解析 DBRef,应用程序必须执行额外查询以返回引用的文档。某些MongoDB驱动程序提供了将 DBRef 解析为文档的辅助方法,但解析不是自动进行的。

DBRef 具有以下字段:

$ref

$ref 字段包含被引用文档所在集合的名称。

$id

$id 字段包含引用文档中 _id 字段的值。

$db

可选。

包含被引用文档所在数据库的名称。

DBRef 文档与以下文档类似:

{ "$ref" : <value>, "$id" : <value>, "$db" : <value> }

以某一集合中的某一文档为例,该文档已在 creator 字段中存储 DBRef:

{ "_id" : ObjectId("5126bbf64aed4daf9e2ab771"), // .. application fields "creator" : { "$ref" : "creators", "$id" : ObjectId("5126bc054aed4daf9e2ab772"), "$db" : "users", "extraField" : "anything" }}

此示例中的 DBRef 指向 users 数据库的 creators 集合中的一个文档,该文档的 _id 字段中包含 ObjectId("5126bc054aed4daf9e2ab772")。它还包含一个可选字段。

注意

DBRef 中的字段顺序十分重要,因而在使用 DBRef 时必须使用上述顺序。

驱动
DBRef 支持
注意

C

不受支持

您可以手动遍历引用。

C++

不受支持

您可以手动遍历引用。

C#

受支持

有关详细信息,请参阅.NET/C# 驱动程序页面。

Go

不受支持

您可以手动遍历引用。

Haskell

不受支持

您可以手动遍历引用。

Java

受支持

有关更多信息,请参阅Java 驱动程序页面。

Node.js

受支持

有关更多信息,请参阅Node.js驱动程序页面。

Perl

受支持

有关详细信息,请参阅Perl 驱动程序页面。

PHP

不受支持

您可以手动遍历引用。

Python

受支持

有关更多信息,请参阅PyMongo驱动程序页面。

Ruby

受支持

有关更多信息,请参阅Ruby 驱动程序页面。

Scala

不受支持

您可以手动遍历引用。