Documents

MongoDB将数据记录存储为BSON文档。

BSON是JSON文档的二进制表示,但它包含的数据类型多于JSON。

有关BSON规范,请参阅bsonspec.org。另见BSON类型

数据结构

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

如下:

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 : NumberLong(1250000)
            }

字段名称

字段名称是字符串。

文档对字段名称有以下限制:

  1. 字段名称 _id 保留为用作主键;它的值在集合中必须是唯一的, 是不可变的, 并且可以是数组以外的任何类型。

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

  3. 顶级字段名称不能以美元符号 ($) 字符开头。

否则, 从 mongodb 3.6 开始, 服务器允许存储包含点 (即) 和美元符号 (即 $) 的字段名称。

重要

mongodb 查询语言不能始终对其字段名称包含这些字符的文档进行有意义的表示查询 (请参阅 server-30575)。

直到在查询语言中添加支持, 使用 $. 不建议使用字段名称, 也不支持官方 mongodb 驱动程序。

bson 文档可能有多个同名字段。

但是, 大多数 mongodb 接口表示 mongodb 的结构 (例如哈希表) 不支持重复的字段名称。

如果需要操作具有多个同名字段的文档, 请参阅驱动程序的驱动程序文档。

由内部 mongodb 进程创建的某些文档可能具有重复的字段, 但 mongodb 进程不会向现有用户文档添加重复字段。

字段值限制

对于索引集合, 索引字段的值具有 “最大索引密钥长度” 限制。

有关详细信息, 请参阅最大索引键长度。

添加索引的字段长度,必须小于 1024 字节。

点标记

mongodb 使用点表示法访问数组的元素, 并访问嵌入文档的字段。

阵列

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

"<array>.<index>"

嵌入式文档

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

"<embedded document>.<field>"

文档限制

文档具有以下属性:

文档大小限制

bson 文档的最大大小为16兆字节。

最大文档大小有助于确保单个文档不能使用过多的 ram, 或者在传输过程中不能使用过多的带宽。要存储大于最大大小的文档, mongodb 提供了 gridfs api。有关 gridfs 的详细信息, 请参阅 mongofiles 和驱动程序的文档。

文档字段顺序

mongodb 保留写入操作后的文档字段的顺序, 但以下情况除外:

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

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

在2.6 版中进行了更改: 从2.6 版开始, mongodb 积极尝试保留文档中的字段顺序。

在2.6 版之前, mongodb 没有主动保留文档中字段的顺序。

_id 字段

在 mongodb 中, 存储在集合中的每个文档都需要一个唯一的 _id 字段, 该字段充当主键。

如果插入的文档省略了 _id 字段, mongodb 驱动程序将自动为 _id 字段生成 objectid。

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

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

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

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

  • _id 字段可能包含数组以外的任何 bson 数据类型的值。

警告

若要确保复制正常工作, 请不要将 bson 正则表达式类型的值存储在 _id 字段中。

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

使用对象。

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

生成自动递增的数字。

在应用程序代码中生成 uuid。为了在集合和 _ id 索引中更有效地存储 uuid 值, 请将 uuid 存储为 bson bindata 类型的值。

在以下情况下, binddata 类型的索引键更有效地存储在索引中:

二进制子类型值的范围为0-7 或 128-135, 并且字节数组的长度为: 0、1、2、3、4、5、6、7、8、10、12、14、16、20、24或32。

使用驱动程序的 bson uuid 设施生成 uuid。请注意, 驱动程序实现可能以不同的方式实现 uuid 序列化和反序列化逻辑, 这可能与其他驱动程序不完全兼容。有关 uuid 互操作性的信息, 请参阅驱动程序文档。

注意

大多数 mongodb 驱动程序客户端将包括 _id 字段, 并在将插入操作发送到 mongodb 之前生成一个 objectid;

但是, 如果客户端发送的文档没有 _id 字段, 则 mongod 将添加 _id 字段并生成 objectid。

文档结构的其他用途

除了定义数据记录外, mongodb 还在整个过程中使用文档结构, 包括但不限于: 查询筛选器、更新规范文档和索引规范文档

查询筛选器文档

查询筛选器文档指定确定要选择用于读取、更新和删除操作的记录的条件。

可以使用 <field>: <value> 表达式来指定相等条件和查询运算符表达式。

{
  <field1>: <value1>,
  <field2>: { <operator>: <value> },
  ...
}

更新规范文档

更新规范文档使用更新运算符指定要在 db.collection.update() 操作期间对特定字段执行的数据修改。

{
  <operator1>: { <field1>: <value1>, ... },
  <operator2>: { <field2>: <value2>, ... },
  ...
}

索引规范文档

索引规范文档定义要索引的字段和索引类型:

{ <field1>: <type1>, <field2>: <type2>, ...  }

参考资料

https://docs.mongodb.com/manual/introduction/