`
yongtree
  • 浏览: 234014 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

为MongoDB增加自增长主键生成的功能

阅读更多

每个MongoDB的document都有一个_id字段作为它的第一个属性,这个值通常是一个BSON对象id,因此,这个id对于集合中的每个成员都是唯一的,如果用户插入一个document没有提供一个id,数据库将自动生成一个id,并存储在_id字段。   
   The BSON ObjectId Datatype   
一个BSON ObjectID是由12个字节组成:4字节时间+3字节机器id+2字节进程id+3字节的数字
"_id" : ObjectId("4c691e72ed2a47b462dfa806") }


有时候我们的应用中需要自增长的数字型主键,MongoDB在这方面并没有给我们提供支持,我们需要加以改造,使其具有自增长主键生成的功能。此次的功能改造,依赖的是morphia开源项目(MongoDB在java语言上的ORM实现,http://code.google.com/p/morphia/),直接上代码吧。


首先定义一个保存各个 collection的主键增量值的系统配置collection:StoredSeqence

java 代码
  1. /**  
  2.  * MongoDB自增长主键维护队列,类似于MSSQL,Oracle维护主键的方式  
  3.  *   
  4.  * @author yongtree  
  5.  * @date 2011-1-17 下午06:58:05  
  6.  * @version 1.0  
  7.  */  
  8. @Entity(noClassnameStored=true)   
  9. public class StoredSeqence implements Serializable {   
  10.   
  11.     private static final long serialVersionUID = 1L;   
  12.   
  13.     @Id  
  14.     String collName;   
  15.   
  16.     Long value;   
  17.        
  18.   
  19.     public StoredSeqence(){   
  20.            
  21.     }   
  22.        
  23.     public StoredSeqence(String collName) {   
  24.         this.collName = collName;   
  25.     }   
  26.   
  27.     public Long getValue() {   
  28.         return value;   
  29.     }   
  30.   
  31.     public void setValue(Long value) {   
  32.         this.value = value;   
  33.     }   
  34.   
  35.     public String getCollName() {   
  36.         return collName;   
  37.     }   
  38.   
  39.     public void setCollName(String collName) {   
  40.         this.collName = collName;   
  41.     }   
  42.   
  43.        
  44.   
  45.        
  46. }   

然后定义一个实体的基类,在基类中处理主键生成。

java 代码
  1. /**  
  2.  * 自增长数字类型主键的Mongo实体  
  3.  *   
  4.  * @author yongtree  
  5.  * @date 2011-1-17 下午04:11:04  
  6.  * @version 1.0  
  7.  */  
  8. public abstract class LongPKMongoEO extends BaseMongoEO {   
  9.   
  10.     @Id  
  11.     Long _id;   
  12.   
  13.     @Transient  
  14.     protected Datastore ds;   
  15.        
  16.        
  17.   
  18.     public void setDs(Datastore ds) {   
  19.         this.ds = ds;   
  20.     }   
  21.   
  22.     @PrePersist  
  23.     void prePersist() {   
  24.            
  25.         //自增性主键的处理   
  26.            
  27.         if (_id == null) {   
  28.             String collName = ds.getCollection(getClass()).getName();   
  29.             Query<StoredSeqence> q = ds.find(StoredSeqence.class"_id",   
  30.                     collName);   
  31.             StoredSeqence ss = q.get();   
  32.             if(ss==null){//不存在该实体的注册,则新创建一个   
  33.                 ss = new StoredSeqence(collName);   
  34.                 ss.setValue(1l);   
  35.             }else{   
  36.                 ss.setValue(ss.getValue()+1);   
  37.             }   
  38.             ds.save(ss);   
  39.             _id=ss.value;   
  40.         }   
  41.     }   
  42.   
  43.     public Long getId() {   
  44.         return _id;   
  45.     }   
  46.   
  47. }  



这样自增长主键的生成的主要功能基本上已经完成了,具体如何使用,接下来将根据实际的项目再做介绍,请继续关注我的博客

 

原文:http://www.po-soft.com/hi/yongtree/blog/2157

0
8
分享到:
评论

相关推荐

    MongoDB插入文档与ObjectID操作.pdf

    10. **自动增长的 id**:与 SQL 数据库中的自动递增主键不同,MongoDB 并不提供类似的功能。虽然 ObjectId 可以视为一种自动增长的机制,但它基于时间戳和其他因素生成,而不是简单的序列号。 在实际操作 MongoDB ...

    JAVA对MongoDB的操作.doc

    5. **自增长主键** - MongoDB中的每个文档都有一个 `_id` 字段作为主键。如果在插入时未指定 `_id`,系统会自动生成一个`ObjectId`。 6. **插入操作** - **四种插入数据的方法**: - **方法1**:使用`...

    mongotest.zip

    默认情况下,MongoDB 会为 `@Id` 字段生成唯一的 ObjectId,但在这个示例中似乎想要实现自增长的整数主键。为了实现这一目标,我们可以使用自定义 ID 生成策略。一种可能的方法是在保存文档前先查询最大 ID,然后加 ...

    Mongodb自增id实现方法

    通过这种方式,可以在不内置自增ID功能的情况下,确保在并发环境下安全地生成唯一的自增ID。不过,这种方法需要额外的存储空间和处理步骤,对于大规模并发写入的情况,可能需要评估性能影响。在设计数据库架构时,应...

    Java操作MongoDB数据库方法详解

    **四、自增长主键** MongoDB 的主键是 `_id` 字段,通常使用 `ObjectId` 类型。不过,开发者也可以自定义 `_id`,只要保证其唯一性。例如,创建一个生成 `ObjectId` 的工具方法: ```java public class Tools { ...

    第大数据微服务架构+区块链第15单元 练习手册试题及答案.docx

    - 可以自定义主键,但$inc命令通常用于更新计数器,而不是生成自增长主键。 5. MongoDB的`find()`方法: - `find()`方法用于查询文档,可以接受查询条件并返回结构化的文档。 - `projection`参数是可选的,用于...

    12241078_兰登科_水果批发市场综合应用系统的设计与实现(全文标明引文)1

    9. **数据分析与报表**:为决策提供依据,系统可能包含数据分析功能,如销售统计、库存分析等,以及可视化报表展示。 10. **性能优化**:针对大量并发访问和大数据处理,可能探讨了缓存策略、负载均衡、数据库优化...

    数据库课程设计报告

    - **主要需求**:客户需求增加、客户登记时间分散、收益增长等因素要求系统能高效处理客房预订、空闲情况、客户信息、住宿费用等数据。 - **功能需求**: - 客户登记 - 房间管理 - 客户查询 - 房间查询 - 收入...

    MySQL面试题目(16个题目)

    MySQL 面试题目知识点汇总 本资源摘要信息涵盖了 ...* 数据库自增长序列或字段、UUID、Redis 生成 ID、Twitter 的 snowflake 算法、利用 zookeeper 生成唯一 ID、MongoDB 的 ObjectId 等都是分布式主键方案的选择。

    2018面试宝典核心篇

    - **自增长字段索引**:InnoDB中的自增长字段必须单独建立索引;MyISAM允许与其他字段联合建立索引。 - **表清空效率**:MyISAM清空表时会重新构建表,效率较高;而InnoDB则是一行一行地删除,效率较低。 #### ...

    Mysql的核心要点

    - **自动增长**(`AUTO_INCREMENT`): 自动为新记录分配唯一的ID值。 - **注释**: 可以为表、列等添加注释信息,便于理解。 以上内容概述了MySQL的核心要点,包括基本概念、操作、优化策略、部署方案、数据类型等方面...

    Mycat数据库中间件 v1.13

    支持全局序列号,解决分布式下的主键生成问题。 分片规则丰富,插件化开发,易于扩展。 强大的web,命令行监控。 支持前端作为mysq通用代理,后端JDBC方式支持Oracle、DB2、SQL Server、mongodb、巨杉。 支持...

    Mycat2数据库中间件-其他

    支持全局序列号,解决分布式下的主键生成问题。分片规则丰富,插件化开发,易于扩展。强大的web,命令行监控。支持前端作为mysq通用代理,后端JDBC方式支持Oracle、DB2、SQL Server、mongodb、巨杉。支持密码加密...

    Mycat数据库中间件-其他

    支持全局序列号,解决分布式下的主键生成问题。 分片规则丰富,插件化开发,易于扩展。 强大的web,命令行监控。 支持前端作为mysq通用代理,后端JDBC方式支持Oracle、DB2、SQL Server、mongodb、巨杉。 支持密码...

Global site tag (gtag.js) - Google Analytics