mongodb和mysql中自动增长id_如何在java中维护MongoDB的_id字段的自动增长
_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字段的自动增长相关推荐
- java中为什么同步_如何在Java中同步工作
如何在Java中同步工作 首先, 这是一个示例 : public class Deadlock { static class Friend { private final String name; p ...
- java 中覆 写tostring_如何在Java中正确覆盖toString()?
如何在Java中正确覆盖toString()? 听起来有点愚蠢,但我需要帮助我的toString()方法,这是非常irking. 我尝试在网上查找,因为toString是搞砸了,"没有找到K ...
- java中求组快速排序函数,如何在Java中实现快速排序?
成为专业认证的快速排序是一种分而治之的算法.在分治算法的设计范式中,我们先递归地将问题分解成子问题,然后再求解子问题,最后将求解结果进行组合得到最终结果.在本文中,我们将重点讨论Java中的快速排序本 ...
- java文件中获取创建日期_如何在Java中获取文件的上次修改日期
java文件中获取创建日期 Sometimes we need to get the file last modified date in Java, usually for listeners li ...
- java 系统自动检测_如何在Java中检测OS(操作系统)名称?
java 系统自动检测 To detect the OS (operating system) name in Java, we use the getProperties() method, whi ...
- java中套接字,如何在java中获得一个开放的套接字?
在 Java中,我如何获得一个开放的套接字?我有2个JFrame;在第一个JFrame中,我打开了Client socket的连接.在同一个JFrame中,我创建了另一个JFrame(JFrame2) ...
- java自动违例设计,如何在Java中创建自己的违例
并不一定非要使用java违例.这一点必须掌握,因为经常都需要创建自己的违例,以便指出自己的库可能生成的一个特殊错误--但创建Java分级结构的时候,这个错误是无法预知的. 为创建自己的违例类,必须从一 ...
- java中复制图片_如何在Java中实现复制图片
packagecopyImage;importjava.io.BufferedReader;importjava.io.File;importjava.io.FileInputStream;impor ...
- 如何在Java中使用表达式_如何在java中计算表达式?
我在快速谷歌后发现了这段代码: import java.util.Stack; /** * Class to evaluate infix and postfix expressions. * * @ ...
最新文章
- 招商银行、To B智能投顾讲述:金融机构的人工智能实践 | CCF-GAIR 2017
- 小程序 页面禁止左右上下滑动
- date js 半年_JavaScript Date对象
- Nginx的Mainline version、Stable version、Legacy version的版本区别
- Linux管理磁盘配额
- 软件测试工程师门槛:新人如何做好功能测试?
- 滑块验证码Java实现
- Atitit.android播放smb 网络邻居视频文件解决方案
- ActiveMQ消息队列
- Ubuntu 桌面美化教程
- maven中resource配置详解
- springMVC实现图片打包下载
- C语言字符串分割 trimmed simplified split
- iOS: pch 如何添加项目中
- A Game of Thrones(23)
- MySQL数据库管理员用户密码忘记了怎么办?
- uniapp搜索出的文字高光并添加锚点
- javaweb JAVA JSP在线考试系统网上考试系统jsp网上在线考核网站源码(在线考试报名)
- ebs R12下破解apps用户密码
- C语言递归解决八皇后问题