MongoDB使用BSON文档来存储数据纪录。BSON是JSON文档的二进制表示。尽管它比JSON包含更多的数据类型。对于BSON规范,查看bsonspec.org,另请参见BSON类型。javascript
MongoDB的文档是由字段和值组成的,具备下列的结构:java
{ 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) }
上述字段具备下列数据类型:mongodb
_id
是一个 ObjectId 对象segmentfault
name
是一个嵌入式文档,包含first
和last
数组
birth
和death
包含数据类型的值服务器
contribs
包含一个字符串数组post
views
包含 NumberLong 类型3d
字段名称是字符串。
文档对于字段名具备如下限制:code
字段名_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不会尽可能维持原文档中的字段顺序。
在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...