Documents

在本页面

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

MongoDB 文档。

Document Structure

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

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

字段的值可以是 BSON data types中的任何一个,包括其他文档,数组和文档数组。例如,以下文档包含各种类型的值:

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)
            }

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

  • _id拥有ObjectId

  • name持有嵌入文档,其中包含字段firstlast

  • birthdeath保留* Date *类型的值。

  • contribs拥有字符串数组

  • views拥有* NumberLong *类型的值。

Field Names

字段名称是字符串。

Documents对字段名称有以下限制:

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

  • 字段名称 不能 包含null字符。

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

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

Important

MongoDB 查询语言不能始终有效地对字段名称包含这些字符的文档表示查询(请参见SERVER-30575)。

在以查询语言添加支持之前,不建议在字段名称中使用$.,并且官方 MongoDB 驱动程序不支持。

BSON 文档可能有多个具有相同名称的字段。但是,大多数MongoDB interfaces表示 MongoDB 具有不支持重复字段名称的结构(例如,哈希表)。如果您需要处理具有多个同名字段的文档,请参见driver documentation

内部 MongoDB 流程创建的某些文档可能具有重复的字段,但是* no * MongoDB 流程将永远向现有的用户文档中添加重复的字段。

字段值限制

对于indexed collections,索引字段的值限制为最大索引键长度。有关详细信息,请参见最大索引键长度

Dot Notation

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

Arrays

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

"<array>.<index>"

例如,给定文档中的以下字段:

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

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

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

See also

  • $[]所有位置运算符,用于更新操作,

  • $[/<identifier/>]已过滤位置运算符,用于更新操作,

  • $位置运算符,用于更新操作,

  • $投影运算符,当数组索引位置未知时

  • 查询数组用于数组的点表示法示例。

Embedded Documents

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

"<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"

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

Document Limitations

文档具有以下属性:

文件大小限制

BSON 文档的最大大小为 16 MB。

最大文档大小有助于确保单个文档不会使用过多的 RAM 或在传输过程中占用过多的带宽。要存储大于最大大小的文档,MongoDB 提供了 GridFS API。有关 GridFS 的更多信息,请参见mongofilesdriver的文档。

文件 site 订单

在以下情况下,MongoDB 会在写操作之后保留文档字段的 Sequences* except *:

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

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

在 2.6 版中进行了更改:从 2.6 版开始,MongoDB 积极尝试保留文档中的字段 Sequences。在 2.6 版之前,MongoDB 并未主动保留文档中字段的 Sequences。

_id 字段

在 MongoDB 中,存储在集合中的每个文档都需要一个唯一的_id字段,该字段充当primary key。如果插入的文档省略_id字段,则 MongoDB 驱动程序会自动为_id字段生成ObjectId

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

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

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

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

  • _id字段可以包含除数组之外的任何BSON 数据类型的值。

Warning

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

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

  • 使用ObjectId

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

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

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

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

  • 二进制子类型的值在 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 互操作性的信息,请参见driver documentation

Note

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

文件结构的其他用途

除了定义数据记录,MongoDB 还在整个文档结构中使用,包括但不限于:query filters更新规格文件索引规格文件

查询过滤器文档

查询过滤器文档指定确定用于选择哪些记录以进行读取,更新和删除操作的条件。

您可以使用<field>:<value>表达式指定相等条件和query operator表达式。

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

有关示例,请参见:

更新规范文档

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

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

有关示例,请参见Update specifications

索引规格文件

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

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