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

文档 (Document)

文档是 MongoDB 中数据的基本单位。

MongoDB 的面向对象数据模型可让您构建数据以反映代码库中的对象模型,这样就无需关系数据库所要求的对象关系映射。

注意

MongoDB 将数据记录存储为 BSON 文档。BSON 是 JSON 文档的二进制表示形式,但它包含的数据类型比 JSON 多。有关 BSON 规范,请参阅 bsonspec.org。另请参阅 MongoDB BSON 类型。

一个 MongoDB 文档。

MongoDB 文档由成对的字段和字段值组成,并具有以下结构:

{
field1: value1,
field2: value2,
field3: value3,
...
fieldN: valueN
}

字段值可以是任何一种 BSON 数据类型,包括其他文档、数组和文档数组。例如,以下文档包含不同类型的值:

var mydoc = {
_id: ObjectId("5099803df3f4948bd2f98391"),
name: { first: "Alan", last: "Turing" },
birth: new Date('Jun 23, 1912'),
death: new Date('Jun 07, 1954'),
contribs: [ "Turing machine", "Turing test", "Turingery" ],
views : Long(1250000)
}

上述字段具有以下数据类型:

  • _id 具有 ObjectId。

  • name 包含一份嵌入式文档,文档包含字段 first 和 last。

  • birth 和 death 保存日期类型的值。

  • contribs 持有一个字符串数组。

  • views 持有一个 NumberLong 类型的值。

字段名称为字符串。

Documents have the following restrictions on field names:

  • 字段名称 _id 保留用作主键;它的值在集合中必须是唯一的、不可变的,并且可以是除数组或正则表达式之外的任何类型。如果 _id 包含子字段,则子字段名称不能以 ($) 符号开头。
  • 字段名称不能包含 null 字符。

  • 服务器允许存储包含点 (.) 和美元符号 ($) 的字段名称。

  • MongodB 5.0 改进了对在字段名称中使用 ($) 和 (.) 的支持。有一些限制。请参阅字段名称注意事项,了解详情。

  • 每个字段名称在文档中必须是唯一的。 不得存储具有重复字段的文档,因为如果文档具有重复字段,MongoDB CRUD操作可能会出现意外行为。

MongoDB查询语言不支持具有重复字段字段的文档:

  • 尽管某些BSON构建者可能支持创建具有重复字段名称的BSON文档,但即使插入成功或看似成功,也不支持将这些文档插入MongoDB 。

  • 示例,通过MongoDB驱动程序插入具有重复字段名称的BSON文档可能会导致驱动程序在插入之前静默删除重复值,或者可能导致插入包含重复字段的无效文档。查询这些文档会导致结果不一致。

  • 即使更新成功或看似成功,也不支持更新具有重复字段名称的文档。

从MongoDB6.1 开始,要查看文档是否具有重复的字段名称,请使用validate 命令并将full 字段设立为true 。在任何MongoDB版本中,使用$objectToArray 聚合操作符可查看文档是否具有重复的字段名称。

MongoDB 使用点符号来访问数组的元素和访问嵌入式文档的字段。

要通过从零开始的索引位置指定或访问数组的元素,请用点号 (.) 将数组名称和从零开始的索引位置连接,并用引号引起来:

"<array>.<index>"

例如,假设文档中包含以下给定字段:

{
...
contribs: [ "Turing machine", "Turing test", "Turingery" ],
...
}

要指定 contribs 数组中的第三个元素,使用点符号 "contribs.2"。

有关查询数组的示例,请参阅:

注意

位置操作符

  • $[] 所有位置操作符在更新操作期间更新指定数组字段中的所有元素。

  • $[<identifier>] 过滤的位置操作符会更新符合 arrayFilters 中指定条件的所有数组元素。

  • $ 位置操作符可以更新符合查询条件的第一个数组元素,而无需指定其索引。

  • $ 投影操作符在读操作中返回与查询条件匹配的第一个数组元素。

  • 有关包含按零基数组索引位置查询的数组的点表示法示例,请参阅查询数组。

要使用点符号指定或访问嵌入式文档的字段,请将嵌入式文档名称与点 ( .) 和字段名称连接起来,并用引号引起来:

"<embedded document>.<field>"

例如,假设文档中包含以下给定字段:

{
...
name: { first: "Alan", last: "Turing" },
contact: { phone: { type: "cell", number: "111-222-3333" } },
...
}
  • 要在 name 字段中指定名为 last 的字段,请使用点符号 "name.last"。

  • 要在 contact 字段中指定 phone 文档中的 number,请使用点符号 "contact.phone.number"。

警告

分区字段不能使用包含点 (.) 的字段名称。

有关查询嵌入式文档的示例,请参阅:

文档具有以下属性:

BSON文档大小的上限为 16 MB。

The maximum document size helps ensure that a single document cannot use an excessive amount of RAM or, during transmission, an excessive amount of bandwidth. To store documents larger than the maximum size, MongoDB provides the GridFS API. For more information about GridFS, see mongofiles and the documentation for your driver.

与 JavaScript 对象不同,BSON 文档中的字段为有序字段。

对于查询,字段顺序行为如下:

  • 比较文档时,字段排序很重要。例如,在查询中将文档与字段 a 和 b 进行比较时:

    • {a: 1, b: 1} 等于 {a: 1, b: 1}

    • {a: 1, b: 1} 不等于 {b: 1, a: 1}

  • 为了高效执行查询,查询引擎可能会在查询处理过程中对字段重新排序。在其他情况下,当处理这些投影运算符时,可能会对字段重新排序:$project、$addFields、$set 和 $unset。

    • 字段重新排序可能发生在中间结果以及通过查询返回的最终结果中。

    • 由于某些操作可能会对字段重新排序,因此对于使用前面列出的投影操作符的查询,您不应依赖于这些查询结果中返回的特定字段排序。

对于写入操作,MongoDB 会保留文档字段的顺序,但以下情况除外:

  • _id 字段始终是文档中的第一个字段。

  • 包含字段名称 renaming 的更新可能会导致文档中的字段重新排序。

在MongoDB中,存储在标准集合中的每个文档都需要一个唯一的_id字段作为主键。如果插入的文档省略了 _id字段,则MongoDB驱动程序会自动为 _id字段生成 ObjectId。

这也适用于通过执行 upsert: true 的更新操作插入的文档。

注意

在时间序列集合中,文档不需要唯一的_id字段,因为MongoDB不会在_id 字段上创建索引。

_id 字段具有以下行为和约束:

  • 默认情况下,MongoDB 在创建集合期间会在 _id 字段上创建唯一索引。

  • _id 字段始终是文档中的第一个字段。如果在服务器收到的文档中,_id 不是第一个字段,则服务器会将该字段移动到开头。

  • 如果 _id 包含子字段,则子字段名称不能以 ($) 符号开头。

  • _id 字段可以包含任何 BSON 数据类型的值(数组、正则表达式或未定义类型除外)。

    警告

    为了确保复制功能正常,请勿在 _id 字段中存储 BSON 正则表达式类型的值。

以下是存储 _id 值的常见选项:

  • 使用自然唯一标识符(如果可用)。这样可以节省空间并避免附加索引。

  • 生成一个自动递增的数字。

  • 在应用程序代码中生成 UUID。为了更有效率地将 UUID 值存储在该集合和 _id 索引中,请将 UUID 存储为 BSON BinData 类型的值。

    如果满足以下条件,则 BinData 类型的索引键可以更有效地存储在索引中:

    • 二进制子类型值的范围是 0-7 或 128-135,并且

    • 字节数组的长度为:0、1、2、3、4、5、6、7、8、10、12、14、16、20、24 或 32。

  • Use your driver's BSON UUID facility to generate UUIDs. Be aware that driver implementations may implement UUID serialization and deserialization logic differently, which may not be fully compatible with other drivers. See your driver documentation for information concerning UUID interoperability.

注意

大多数 MongoDB 驱动程序客户端会包含 _id 字段并生成 ObjectId,然后再将插入操作发送到 MongoDB。但是,如果客户端发送的文档没有 _id 字段,则 mongod 会添加 _id 字段并生成 ObjectId。

获得技能徽章

免费掌握“MongoDB架构基础”!

了解详情

给本页内容打分