六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 299|回复: 0

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

[复制链接]

升级  34.67%

24

主题

24

主题

24

主题

秀才

Rank: 2

积分
102
 楼主| 发表于 2013-1-30 01:55:52 | 显示全部楼层 |阅读模式
_id字段是MongoDB中一个特殊的字段,它的类型为BSON ObjectId。它是每条记录的第一个属性,并且该属性值必须唯一。
BSON ObjectId长12个字节,包含4字节的时间戳、3字节的机器id、2字节的进程id以及3字节长的计数器。它的结构如下图所示:
01234567891011
timemachinepidinc

我们使用命令行查找某一条记录时,通常结果呈现如下的格式:
 
{ _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); 
让我们来看一下效果,注意红笔划出的地方。
 


至此,我们就实现了维护_id字段的自动增长。
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表