1

MongoDB使用BSON文档来存储数据纪录。BSON是JSON文档的二进制表示。尽管它比JSON包含更多的数据类型。对于BSON规范,查看bsonspec.org,另请参见BSON类型。

文档结构

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

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

  • _id 是一个 ObjectId 对象

  • name 是一个嵌入式文档,包含firstlast

  • birthdeath包含数据类型的值

  • contribs 包含一个字符串数组

  • views包含 NumberLong 类型

字段名称

字段名称是字符串。
文档对于字段名具有以下限制:

  • 字段名_id被保留用来作为主键,在集合中它的值必须是唯一的,是不可变的,可以是除数组外的任何类型

  • 字段名称不能为美元符号$开头

  • 字段名称不能包含.字符

  • 字段名称不能包含null字符
    BSON文档可以有多个相同的字段名,大多数 MongoDB接口,然而,表示一个结构的MongoDB (即哈希表) 不支持重复的字段名称,如果你需要操作多个相同字段名的文档,请查阅你的驱动文档。

一些通过内部MongoDB进程创建的文档可能会包含重复的字段, 但是 MongoDB进程将永远不会添加重复的字段到一个已存在的用户文档。

字段值限制

对于已索引的集合,索引字段的值将会有一个最大索引Key的长度限制。查阅最大索引Key长度来获取详情。

点符号

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

数组

通过从0开始的数字下标来指定或者访问数组中的一个元素。用点符号来连接数组名称和从0开始的数字下标,并用引号包括起来:

"<array>.<index>"

例如,在一个文档中给出以下字段:

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

指定数组中contribs字段中的第三个元素,使用点符号contribs.2
另请参阅:

  • 当更新时,使用$映射来操作符

  • 当数组的索引位置未知的时候,$可以映射为操作符

  • 在数组中使用点符号查询数组的例子

内嵌文档

使用点符号指定或者访问一个内嵌文档的字段,使用点符号来连接内嵌文档名称和字段名称,并用引号包括起来:

"<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文档的最大值为16M。
最大文档的大小有助于确保一个文档不能使用过多的RAM或者在传输的过程中也会占用大量的带宽。存储的文档的大小超过了最大值,MongoDB提供 GridFS API。参阅 mongofiles和你的驱动文档关于GridFS的更多信息。

文档字段排序

MongoDB会维持在写入操作中文档字段的顺序,下列情况除外:

  • _id字段总是在文档的第一个字段

  • 包含字段名重命名的更新操作可能会导致文档的字段重新排序
    在2.6版本中改变:自2.6版本开始,MongoDB会尽量维持原文档中的字段顺序。在2.6版本之前,MongoDB不会尽量维持原文档中的字段顺序。

_id字段

在MongoDB中,集合中保存文档需要一个唯一的_id字段作为主键。如果_id字段在文档中未指定,MongoDB会将 ObjectId作为_id字段的默认值,即如果一个文档在插入的时候在顶级字段中不包含_id,MongoDB驱动会增加一个带有ObjectId_id字段。
除此以外,如果Mongod接收一个不包含_id字段的文档来插入(即通过一个更新操作来执行upsert选项),Mongod将会增加一个带有ObjectId_id字段。
_id字段具有以下行为和约束:

  • 默认情况下,在一个集合创建的时候,MongoDB在_id上创建一个唯一索引。

  • _id总是在文档的第一个字段。如果服务器接收到的文档_id文档不在最前面,那么服务器将会移动该字段到文档的开始。

  • _id字段可能会包含除了数组之外的任何BSON数据类型
    警告:为了保证复制功能,不要保存_id字段为BSON正则表达式类型的值。

下列是用来保存_id值的常见做法:

  • 使用一个ObjectId

  • 如果可以用的话,使用一个天然的唯一标识符。这样节省了空间和避免了额外索引。

  • 生成一个自增数字

  • 在你的程序中生成一个UUID。在集合中和_id字段中更高效的存储UUID的值,存储UUID的值使用BSON的BinDate类型
    索引键属于 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的互操作性的更多信息。

注意:大多数MongoDB驱动客户端将会在发送插入操作到MongoBD之前包含_id字段并生成一个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://segmentfault.com/a/11...
原文地址:https://docs.mongodb.com/manu...


魔王卷子
940 声望33 粉丝

PHP程序员,专注于后端!