下面是ObjectId的构成:
ObjectId使用12字节的存储空间,每个字节两位十六进制数字,是一个24位的字符串。12字节按照如下方式生成:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11
时间戳 | 机器码 | PID | 计数器
-----------------------------------------------
>时间戳:从标准的纪元开始的时间戳,单位为秒。
>机器码:所在主机的唯一标示符,通常为机器主机名的散列值。
>PID:产生ObjectId的进程标示符。
>计数器:自动增加计数器,同一秒最多允许每个进程拥有256的3次方(16777216)个不同的ObjectId。
文档的"_id"键:
1.插入文档的时候,没有该键,系统自动创建一个。
2.mongodb服务器可自动创建,通常在客户端由驱动程序完成:
>减少数据库扩展的负担
>驱动程序提供丰富的API,可返回ObjectId,也可插入文档;若有服务器生成的话,驱动程序需单独的查询来确定插入的文档中的"_id"值。
7.日期型 存储的是从标准纪元开始的毫秒数,不存储时区。
{"name":"xx","date":new Date()} 本机查看:{ "_id" : ObjectId("5001047632e3988ad237a206"), "name" : "xx", "date" : ISODate("2012-07-14T05:32:38.189Z") }
8.正则式 文档中可以包含正则表达式,采用javascript的正则表达式语法
{"regex":/[0-9]/g}
9.代码或者函数 javascript代码(mongodb中值直接保存到数据库,不对值进行执行,因此不存在安全问题)
{"setName":function(){var name="jk";alert(name)}}
10.二进制数 可以由任意字节的串组成。shell中无法使用。
11.最大值 BSON包括一个特殊类型,表示可能的最大值。shell没有这个类型。
12.最小值 BSON包括一个特殊类型,表示可能的最小值。shell没有这个类型。
13.未定义(undefined) 文档中也可以使用未定义类型
{"name":undefined}
14.数组 值的集合或者列表可以表示成数组
{"name":["s","d","f"]}
15.内嵌文档 文档可以包含文档,作为值嵌入到父文档中
{"sch" : "s"
"catl" : {
"c1" : {"cls1" : "cs1","cls2" : "cs2","cls3" : "cs3"}
"c2" : {"cls1" : "cs1","cls2" : "cs2","cls3" : "cs3"}
"c3" : {"cls1" : "cs1","cls2" : "cs2","cls3" : "cs3"}
}
}
从面向对象的角度来理解文档,文档就是个对象,文档里面的key/value就是属性和属性值。