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

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

0

1

2

3

4

5

6

7

8

9

10

11

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

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

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

大小: 2 KB

3

1

分享到:

2010-04-26 16:39

浏览 10385

分类:数据库

评论

4 楼

di1984HIT

2014-12-15

自增是不行,但是保证唯一就可以吧,只要这个id是我生成的,有一定含义。当然建立一个自增变量也行,这得看mongo支持不

3 楼

linshouyi

2012-08-02

在客户端维护的id肯定不行,并发高了肯定出问题,只能在服务端建立一个id自增变量。

2 楼

zhc0822

2011-04-22

kimmking 写道

不如实现一个soft的sequence来的实在。

文中的实现方法的问题的确比较大,尤其并发一高,这种方法几乎就没用了。soft的sequence是什么意思?我不太明白。求指点。

1 楼

kimmking

2011-04-22

不如实现一个soft的sequence来的实在。

mongodb和mysql中自动增长id_如何在java中维护MongoDB的_id字段的自动增长相关推荐

  1. java中为什么同步_如何在Java中同步工作

    如何在Java中同步工作 首先, 这是一个示例 : public class Deadlock { static class Friend { private final String name; p ...

  2. java 中覆 写tostring_如何在Java中正确覆盖toString()?

    如何在Java中正确覆盖toString()? 听起来有点愚蠢,但我需要帮助我的toString()方法,这是非常irking. 我尝试在网上查找,因为toString是搞砸了,"没有找到K ...

  3. java中求组快速排序函数,如何在Java中实现快速排序?

    成为专业认证的快速排序是一种分而治之的算法.在分治算法的设计范式中,我们先递归地将问题分解成子问题,然后再求解子问题,最后将求解结果进行组合得到最终结果.在本文中,我们将重点讨论Java中的快速排序本 ...

  4. java文件中获取创建日期_如何在Java中获取文件的上次修改日期

    java文件中获取创建日期 Sometimes we need to get the file last modified date in Java, usually for listeners li ...

  5. java 系统自动检测_如何在Java中检测OS(操作系统)名称?

    java 系统自动检测 To detect the OS (operating system) name in Java, we use the getProperties() method, whi ...

  6. java中套接字,如何在java中获得一个开放的套接字?

    在 Java中,我如何获得一个开放的套接字?我有2个JFrame;在第一个JFrame中,我打开了Client socket的连接.在同一个JFrame中,我创建了另一个JFrame(JFrame2) ...

  7. java自动违例设计,如何在Java中创建自己的违例

    并不一定非要使用java违例.这一点必须掌握,因为经常都需要创建自己的违例,以便指出自己的库可能生成的一个特殊错误--但创建Java分级结构的时候,这个错误是无法预知的. 为创建自己的违例类,必须从一 ...

  8. java中复制图片_如何在Java中实现复制图片

    packagecopyImage;importjava.io.BufferedReader;importjava.io.File;importjava.io.FileInputStream;impor ...

  9. 如何在Java中使用表达式_如何在java中计算表达式?

    我在快速谷歌后发现了这段代码: import java.util.Stack; /** * Class to evaluate infix and postfix expressions. * * @ ...

最新文章

  1. 招商银行、To B智能投顾讲述:金融机构的人工智能实践 | CCF-GAIR 2017
  2. 小程序 页面禁止左右上下滑动
  3. date js 半年_JavaScript Date对象
  4. Nginx的Mainline version、Stable version、Legacy version的版本区别
  5. Linux管理磁盘配额
  6. 软件测试工程师门槛:新人如何做好功能测试?
  7. 滑块验证码Java实现
  8. Atitit.android播放smb 网络邻居视频文件解决方案
  9. ActiveMQ消息队列
  10. Ubuntu 桌面美化教程
  11. maven中resource配置详解
  12. springMVC实现图片打包下载
  13. C语言字符串分割 trimmed simplified split
  14. iOS: pch 如何添加项目中
  15. A Game of Thrones(23)
  16. MySQL数据库管理员用户密码忘记了怎么办?
  17. uniapp搜索出的文字高光并添加锚点
  18. javaweb JAVA JSP在线考试系统网上考试系统jsp网上在线考核网站源码(在线考试报名)
  19. ebs R12下破解apps用户密码
  20. C语言递归解决八皇后问题

热门文章

  1. 原生js封装picker地址三级联动方法
  2. 求解作业车间调度问题的改进遗传算法
  3. HP(惠普)大中华区总裁孙振耀退休感言
  4. 外研社写作阅读大赛整理
  5. 火车头抓取阿里巴巴内容页
  6. windows找不到文件 pythonw
  7. 炒股笔记之反击线形态
  8. pycharm如何使用?
  9. 联想Z5刷android11,联想Z5 Pro GT升级安卓10 ZUI_11.5.141稳定版-支持TWRP偷渡升级
  10. 测试服务器并发量和承载力(压力测试)