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
是一个嵌入式文档,包含first
和last
birth
和death
包含数据类型的值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…