`
zhc0822
  • 浏览: 230572 次
  • 性别: Icon_minigender_1
  • 来自: 宝仔的奇幻城堡
社区版块
存档分类
最新评论

如何在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
分享到:
评论
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文件存储_java_MongoDB_

    在Java开发中,MongoDB常被用于处理结构化和半结构化的数据。本篇文章将深入探讨MongoDB如何进行文件存储,特别是针对大文件的处理。 首先,MongoDB提供了GridFS(Grid File System)规范,这是一个用于存储和检索...

    SpringBoot_MongoDB_MQTT基本环境搭建

    - 数据模型:定义Java对象作为MongoDB文档的映射,使用`@Document`注解标记类,使用`@Id`注解指定主键字段。 3. **MQTT协议**: - MQTT简介:MQTT(Message Queuing Telemetry Transport)是一种轻量级的发布/...

    MongoDB_Architecture_Guide(MongoDB架构指导)(个人翻译版)

    MongoDB有广泛的驱动程序库,支持多种编程语言,如Java、Python、Node.js等,方便开发者集成到各种应用程序中。 14. 社区与生态系统: MongoDB拥有活跃的社区,提供丰富的文档、教程和第三方工具,帮助用户解决...

    mongodb_preview.pdf

    MongoDB中的每个文档都有一个唯一的主键_id字段,通常是用ObjectId()生成的。书中会通过示例来讲解如何设置_id字段。 查询和更新文档是MongoDB中常见的操作。find()方法用于查询文档,MongoDBCursor则用于处理查询...

    mongodb在java中小试牛刀

    MongoDB在Java中被广泛用于构建高性能、可扩展的数据存储解决方案。MongoDB是一个NoSQL数据库,以其灵活性、可伸缩性和高性能而闻名。在Java中使用MongoDB,我们可以借助Spring Data MongoDB框架,它提供了一种简化...

    MongoDB中唯一索引(Unique)的那些事

    缺省情况下,MongoDB的_id字段在创建集合的时候会自动创建一个唯一索引。本文主要描述唯一索引的用法。 关于什么是索引以及唯一索引这里就不做说明了,不清楚的可以自行谷歌或者百度。是什么引起我写这篇文章呢,这...

    基于java的mongodb开发环境搭建

    在Java代码中,可以通过以下方式创建MongoDB连接: ```java import com.mongodb.Mongo; Mongo mongo = new Mongo(); ``` 默认情况下,该连接指向本地主机上的MongoDB服务,端口号为27017。 ##### 2.2 获取数据库...

    mongodb-field-level-encryption:使用Spring Boot 2在MongoDB中设置字段级加密

    以下将详细介绍如何在Java环境中,特别是使用Spring Boot 2,来配置和使用MongoDB的字段级加密。 首先,我们需要理解Spring Data MongoDB,它是Spring框架的一个扩展,提供了与MongoDB数据库交互的能力。要启用字段...

    java mongodb orm 实现-基于mongodb-driver开发的ORM.pdf

    在本文中,我们将讨论如何基于`mongodb-driver`开发一个简单的ORM实现,以简化Java中的MongoDB操作。 首先,MongoDB官方驱动程序虽然功能强大,但对于业务开发来说,直接使用API可能会显得复杂。因此,为了提高开发...

    MongoDB Java查找文档.pdf

    `_id` 字段是 MongoDB 自动生成的唯一标识符,而其他字段是用户定义的数据。 此外,`find()` 方法可以接受查询条件,允许我们筛选特定的文档。例如,如果我们只想找到 "likes" 大于 50 的文档,可以这样做: ```...

    java 中mongodb的各种操作查询的实例详解

    在 Java 中使用 MongoDB 时,需要掌握各种操作查询的方法,本文档将详细介绍 Java 中 MongoDB 的各种操作查询的实例详解。 查询一条数据 在实际应用中,我们经常需要查询一条数据,例如根据 URL 查询对应的 ...

    Mongodb常用命令和java调用

    每个集合都有默认的_id字段作为唯一标识,如果没有指定,MongoDB会自动生成。 MongoDB 提供了一个交互式的shell,可用于管理数据库,包括用户认证、查看和操作数据库、创建和删除集合、监控复制状态、修复数据库、...

    java操作mongodb增删改查

    接下来,我们需要在Java项目中引入MongoDB的Java驱动。对于Maven项目,可以在`pom.xml`文件中添加以下依赖: ```xml <groupId>org.mongodb <artifactId>mongodb-driver-sync <version>4.2.3 ``` #### 三、获取...

    JAVA对MongoDB的操作.doc

    在本文中,我们将深入探讨如何使用Java语言操作MongoDB数据库。MongoDB是一个流行的NoSQL数据库,以其灵活性、高性能和可扩展性而闻名。Java作为广泛使用的编程语言,提供了丰富的API来与MongoDB进行交互。以下是...

    nosql之MOngoDB,java测试类,涵盖常用方法

    在这个Java测试类中,我们将深入探讨MongoDB与Java的集成以及常用的方法。 首先,为了在Java应用中使用MongoDB,我们需要引入MongoDB的Java驱动程序。这通常通过在`pom.xml`或`build.gradle`文件中添加依赖来完成。...

    spring_mongodb_aggregation_grouping:这是一个用于在mongodb中显示聚合分组的简单项目

    在MongoDB中,聚合框架是处理数据的一种强大工具,它允许开发者执行类似SQL的聚合操作,如GROUP BY、SUM、AVG等。本项目"spring_mongodb_aggregation_grouping"专注于利用Spring Data MongoDB库来实现这些功能。...

    MongoDB聚合分组取第一条记录的案例与实现方法

    在这个特定的案例中,开发人员面临一个紧急需求,需要从名为 `mt_resources_access_log` 的集合中根据 `refererDomain` 字段进行分组,并从每个分组中选取最新插入的数据。这个任务在MongoDB中可以通过聚合框架(`...

    springboot与mongo的整合

    这里,`User`是实体类,`String`代表主键类型(通常是MongoDB的_id字段),`findByUsername`是一个自定义查询方法。 为了实现业务逻辑,你可以创建一个Service类,注入`UserRepository`并调用其方法。例如: ```...

    java查询mongodb中的objectid示例

    在Java中与MongoDB进行交互时,经常需要查询具有特定`ObjectId`的文档。`ObjectId`是MongoDB中用于唯一标识文档的一种数据类型,通常作为每个文档的默认 `_id` 字段。本示例将详细解释如何使用Java来查询具有指定`...

    【课程设计】mongodb+javaSpring实现选课系统demo

    在本项目中,我们主要探讨的是如何利用MongoDB数据库与Java Spring框架来构建一个选课系统DEMO。MongoDB是一个流行的NoSQL数据库,它以JSON文档格式存储数据,适合处理大规模、非结构化的数据。而Java Spring框架是...

Global site tag (gtag.js) - Google Analytics