说明:英文原文地址:https://docs.mongodb.com/v3.2/core/document/。
本文章属个人翻译,作个人学习之用,如有雷同,纯属巧合。如有错误之处,欢迎指正。
文档
MongoDB把数据记录存储为BSON文档。BSON文档是JSON文档的二进制表示,它比JSON包含更多的数据类型。BSON规范可参考bsonspec.org。
文档结构
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保存了一个嵌入文档,该嵌入文档含有first和last字段
- birth和death保存Date类型的值
- contribs保存了字符串数组
- views保存了NumberLong类型的值
字段名
字段名是字符串。
文档对字段名有如下限制:
- 字段_id是保留字段,作为主键用。它的值在文档中必须是唯一的,不可以修改,可以是除了数组外的任意类型。
- 字段名不能以美元符号($)开头
- 字段名不能包含点字符(.)
- 字段名不能包含null字符
BSON文档可能会有多个相同名字的字段。大多数MongoDB接口用一种不支持重复字段的机构(如哈希表)来表示文档。如果你需要操作有多个相同名字的字段的文档,参考驱动文档。
某些由内部MongoDB进程创建的文档可能包含重复字段,但是MongoDB进程不会在用户文档中添加重复的字段。
字段值的限制
对于添加了索引的集合,所索引的字段的值有最大索引长度的限制。详情可参考最大索引长度。
点记号法
MongoDB用点记号法
来访问数组中的元素,以及嵌入文档的字段。
数组
要指定或访问一个以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。
最大文档大小是用来确保一个文档的大小不会超出内存大小,或者传输时不超出带宽。如要存储超出最大大小的文档,MongoDB提供了GridFS API。参考mongofiles
和驱动文档以获得关于GridFS的更多信息。
文档字段顺序
MongoDB会保存写操作时的文档字段顺序,以下情况除外:
- _id字段总是文档中的第一个字段
- 包含重命名字段的更新可能导致文档中字段顺序重排
从版本2.6开始,MongoDB总是试图保存文档中的字段顺序。
_id字段
MongoDB中,每个保存在集合中的文档都需要一个唯一的_id字段作为主键。如果插入的文档没有_id字段,MongoDB驱动自动为_id字段生成一个ObjectId
。
通过带upsert:true
选项的更新操作所插入的文档也会自动生成_id字段。
_id字段有如下行为和限制:
默认地,MongoDB在创建文档时在_id字段创建一个唯一索引。
_id字段总是文档的第一个字段。如果服务器收到一个_id字段不是在第一个位置的文档,服务器会把该字段移到开始。
_id字段可以是除数组类型外的其他任意BSON数据类型。
*警告:
为保证复制功能正常,不要在_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互操作性的更多信息。
注意:
大多数MongoDB驱动客户端在将插入操作发送到MongoDB前或把_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>, ... }