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

数据库引用:手册引用和 DBRef

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

重要

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

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

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

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

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

  • 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#

受支持

Go

不受支持

您可以手动遍历引用。

Haskell

不受支持

您可以手动遍历引用。

Java

受支持

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

Node.js

受支持

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

Perl

受支持

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

PHP

不受支持

您可以手动遍历引用。

Python

受支持

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

Ruby

受支持

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

Scala

不受支持

您可以手动遍历引用。