zhc0822 发表于 2013-1-30 01:55:52

如何在java中维护MongoDB的_id字段的自动增长

_id字段是MongoDB中一个特殊的字段,它的类型为BSON ObjectId。它是每条记录的第一个属性,并且该属性值必须唯一。
BSON ObjectId长12个字节,包含4字节的时间戳、3字节的机器id、2字节的进程id以及3字节长的计数器。它的结构如下图所示:
01234567891011timemachinepidinc
我们使用命令行查找某一条记录时,通常结果呈现如下的格式:
 
{ _id : ObjectId( "47cc67093475061e3d95369d" ) , name : "joe" } 
这样的_id值对于用户来说是没有意义的,尤其是在REST的架构中,URI通常是可读的,如果将这串值放入URI,那么URI的可读性将大打折扣。
传统的关系数据库例如mysql,可以将主键设为increment,实现主键从0开始的自动增长,这样的id值,才是可读的,有意义的。MongoDB如何实现_id字段的从0自动增长?我查阅了官方的文档,没有找到答案,于是自己实现了一套折中的方案。
在插入一条新记录的时候,我们可以通过如下操作,来维护_id的自动增长。


[*]首先让我们来完成一些准备工作,读取一个json字符串、获取集合:

BasicDBObject obj = (BasicDBObject) JSON.parse(json);col = db.getCollection(collection);

[*] 倒序查询最后一条记录,代码如下:

DBCursor cursor=col.find().sort(new BasicDBObject("$natural",-1)).limit(1);

[*]  如果查询结果为空,置_id值为0,反之,置_id为集合内最大的_id再加1:

if(cursor.hasNext()){obj.put("_id", Integer.parseInt(cursor.next().get("_id").toString())+1);}else{obj.put("_id", 0);}

[*] 最后,插入该条数据:

col.insert(obj); 
让我们来看一下效果,注意红笔划出的地方。
 

http://dl.iteye.com/upload/attachment/240248/0ab9a583-483b-3c58-bb0a-548261f6df1f.png
至此,我们就实现了维护_id字段的自动增长。
页: [1]
查看完整版本: 如何在java中维护MongoDB的_id字段的自动增长