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

_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字段的自动增长。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值