mongoDB ObiectID详解

1.组成

0

1

2

3

4

5

6

7

8

9

10

11

时间戳

机器ID

PID

计数器


  • 时间戳. 4字节unix时间戳.
  • 机器ID. 主机名md5产生的hash的前三个字节, 或者mac,网络地址,虚拟主机地址

  • Pid. 2自己的进程(或线程)id.

  • 计数器. 3字节的计数器.

2.如何合理使用ObjectId
从objectid生成规则看出,objectid包含了时间信息,大多数情形下,该时间可代表业务处理时间(严格事务的情形下,也不适合采用mongo),如果再加上时间字段,有点浪费空间,如果采用objectid,如何取时间呢?
以一个ObjectId为例
> ObjectId("50751e90c2f1d0081ca4f59a").getTimestamp()
ISODate("2012-10-10T07:06:56Z")
如何表示时间段呢?如大于某个时间:
> secs=1350316800
1350316800
> hexSecs = secs.toString(16)
507c3300
> id = ObjectId(hexSecs+"0000000000000000")
ObjectId("507c33000000000000000000")
> db.user.find({"_id":{$gt:id}})
根据时间戳换后面拼0,就可以比较了。
3.不适用ObjectId,自定义_id
比如使用业务中的唯一id或者自己实现自增id来代替默认的ObjectId
自增可以用以下方法来实现:
mongos> function counter(name) {
... var ret = db.counters.findAndModify({query:{_id:name}, update:{$inc : {next:1}}, "new":true, upsert:true});
... // ret == { "_id" : "users", "next" : 1 }
... return ret.next;
... }
mongos>
mongos> db.users.insert({_id:counter("users"), name:"dbchu"})
mongos> db.users.find()
{ "_id" : 1, "name" : "dbchu" }
mongos> db.users.insert({_id:counter("users"), name:"ccj"})
mongos> db.users.find()
{ "_id" : 1, "name" : "dbchu" }
{ "_id" : 2, "name" : "ccj" }

参考:

http://www.mongodb.org/display/DOCS/Object+IDs

http://www.mongodb.org/display/DOCS/Optimizing+Object+IDs

http://www.kchodorow.com/blog/2011/12/20/querying-for-timestamps-using-objectids/


本文链接: http://taodba.com/2012/10/16/657/mongodb-objectid | The Tao of DBA

你可能感兴趣的:(MongoDB)