_id字段是MongoDB中一个特殊的字段,它的类型为BSON ObjectId。它是每条记录的第一个属性,并且该属性值必须唯一。

BSON ObjectId长12个字节,包含4字节的时间戳、3字节的机器id、2字节的进程id以及3字节长的计数器。它的结构如下图所示:

time

machine

pid

inc

我们使用命令行查找某一条记录时,通常结果呈现如下的格式:

{ _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);

让我们来看一下效果,注意红笔划出的地方。

MongoDB 优化参数配置 mongodb uuid_主键

至此,我们就实现了维护_id字段的自动增长。

MongoDB 优化参数配置 mongodb uuid_主键_02

大小: 2 KB