跳到主要内容

文档

2025年02月25日
柏拉文
越努力,越幸运

前言


文档

一、认识


MongoDB 将数据记录存储为 BSON 文档。BSONJSON 文档的二进制表示形式,但它包含的数据类型比 JSON 多。

二、结构


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

{
field1: value1,
field2: value2,
field3: value3,
...
fieldN: valueN
}
const 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 : NumberLong(1250000)
}

2.1 字段

字段名称为字符串, 文档对字段名称有以下限制:

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

  2. 字段名称不能包含 null 字符。

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

  4. MongodB 5.0 改进了对在字段名称中使用 ($) 和 (.) 的支持。有一些限制。

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

2.2 主键

字段名称 _id 保留用作 主键, 它的值在集合中必须是唯一的、不可变的,并且可以是 除数组或正则表达式之外 的任何类型。如果 _id 包含子字段,则子字段名称不能以 ($) 符号开头。在 MongoDB 中,存储在标准集合中的每个文档都需要一个唯一的 _id 字段作为主键。如果插入的文档省略了 _id 字段,则 MongoDB 驾驶员会自动为 _id 字段生成 ObjectId

_id 字段行为和约束:

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

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

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

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

存储 _id 值常见选项:

  1. 使用对象标识符(ObjectId)。

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

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

  4. 在应用程序代码中生成 UUID。为了更有效率地将 UUID 值存储在该集合和 _id 索引中,请将 UUID 存储为 BSON BinData 类型的值。如果满足以下条件,则 BinData 类型的索引键可以更有效地存储在索引中:

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

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

  5. 使用驱动程序的 BSON UUID 工具生成 UUID。请注意,驱动程序实现可能会以不同的方式实施 UUID 序列化和反序列化逻辑,这可能与其他驱动程序不完全兼容。