MongoDB中我们经常会接触到一个自动生成的字段:”_id”,类型为ObjectId。
ObjectId构成
之前我们使用MySQL等关系型数据库时,主键都是设置成自增的。但在分布式环境下,这种方法就不可行了,会产生冲突。为此,MongoDB采用了一个称之为ObjectId的类型来做主键。ObjectId从表面看是一个由12个字节组成的字符串,那么这12个字节都代表什么含义呢?我们将12个字节进行切分,如下
4个字节 | 3个字节 | 2个字节 | 3个字节
从前往后的含义依次是:
4个字节:服务器的时间戳,单位是秒
3个字节:Mongodb所在机器的机器识别码
2个字节:表示生成该文档的进程ID
3个字节:随机数
ObjectId获取时间
从上面的ObjectId字节描述来看,其实,在ObjectId内部其实是包含不少有用信息的,最直观的就是时间戳,可以知道当前文档记录是什么时候插入的。那么如果根据这里ObjectId的前四个字节来直观查看日期时间呢?
ObjectId("5ed0e2ba05570000c7000b75").getTimestamp().toLocaleString();
此时我们便能够看到如下结果:
ISODate("2014-02-28T06:22:59Z");
对应于MongoDB的命令行的读取应为:
>db.table.find({"_id" : ObjectId("XXXXXXXX")})