当前位置:数据库 > 其它> 正文

mongodb objectid类型

时间:2013-8-24类别:数据库

mongodb objectid类型

mongodb objectid类型

mongodb的objectid类型是一个24位的自动生成的字符串,objectid是一种轻量型的,不同的机器都能用全局唯一的同种方法轻量的生成它,而不是采用传统的自增的主键策略,因为在多台服务器上同步自动增加主键既费力又费时,mongodb从开始设计就被定义为分布式数据库。
 

当我们让一个collection中插入一条不带_id的记录,系统会自动地生成一个_id的key

例如:

  •  
  • 
    > db.t_test.insert({"name":"cyz"})
    > db.t_test.findOne({"name":"cyz"})
    { "_id" : ObjectId("4df2dcec2cdcd20936a8b817"), "name" : "cyz" }
    			

     

  • 可以发现这里多出一个Objectid类型的_id,当然了,这个_id是系统默认生成的,你也可以为其指定一个值,不过在同一collections中该值必须是唯一的
     

    其中objectid类型的24位字符串的组成方式如下:

     

  • TimeStamp
    前4位是一个unix的时间戳,是一个int类别,我们将上面的例子中的objectid的前4位进行提取“4df2dcec”,然后再将他们安装十六进制专为十进制:“1307761900”,这个数字就是一个时间戳,为了让效果更佳明显,我们将这个时间戳转换成我们习惯的时间格式
  •  
  • $ date -d '1970-01-01 UTC 1307761900 sec' -u
    2011年 06月 11日 星期六 03:11:40 UTC
  •  

  • 前4个字节其实隐藏了文档创建的时间,并且时间戳处在于字符的最前面,这就意味着ObjectId大致会按照插入进行排序,这对于某些方面起到很大作用,如作为索引提高搜索效率等等。使用时间戳还有一个好处是,某些客户端驱动可以通过ObjectId解析出该记录是何时插入的,这也解答了我们平时快速连续创建多个Objectid时,会发现前几位数字很少发现变化的现实,因为使用的是当前时间,很多用户担心要对服务器进行时间同步,其实这个时间戳的真实值并不重要,只要其总不停增加就好。
  •  
  •  
  • Machine
    接下来的三个字节,就是 2cdcd2 ,这三个字节是所在主机的唯一标识符,一般是机器主机名的散列值,这样就确保了不同主机生成不同的机器hash值,确保在分布式中不造成冲突,这也就是在同一台机器生成的objectid中间的字符串都是一模一样的原因。


  • pid
    上面的Machine是为了确保在不同机器产生的objectid不冲突,而pid就是为了在同一台机器不同的mongodb进程产生了objectid不冲突,接下来的0936两位就是产生objectid的进程标识符。


  • increment
    前面的九个字节是保证了一秒内不同机器不同进程生成objectid不冲突,这后面的三个字节a8b817,是一个自动增加的计数器,用来确保在同一秒内产生的objectid也不会发现冲突,允许256的3次方等于16777216条记录的唯一性。
  •  
  •  
  •  
  • 客户端生成

  • mongodb产生objectid还有一个更大的优势,就是mongodb可以通过自身的服务来产生objectid,也可以通过客户端的驱动程序来产生,如果你仔细看文档你会感叹,mongodb的设计无处不在的使

    用空间换时间的思想,比较objectid是轻量级,但服务端产生也必须开销时间,所以能从服务器转移到客户端驱动程序完成的就尽量的转移,必须将事务扔给客户端来完成,减低服务端的开销,另还有一点原因就是扩展应用层比扩展数据库层要变量得多。
  • mongodb的ObejctId生产思想在很多方面挺值得我们借鉴的,特别是在大型分布式的开发,如何构建轻量级的生产,如何将生产的负载进行转移,如何以空间换取时间提高生产的最大优化等等。

     

    标签:
    上一篇下一篇

    猜您喜欢

    热门推荐