每个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 代码
-
-
-
-
-
-
-
- @Entity(noClassnameStored=true)
- public class StoredSeqence implements Serializable {
-
- private static final long serialVersionUID = 1L;
-
- @Id
- String collName;
-
- Long value;
-
-
- public StoredSeqence(){
-
- }
-
- public StoredSeqence(String collName) {
- this.collName = collName;
- }
-
- public Long getValue() {
- return value;
- }
-
- public void setValue(Long value) {
- this.value = value;
- }
-
- public String getCollName() {
- return collName;
- }
-
- public void setCollName(String collName) {
- this.collName = collName;
- }
-
-
-
-
- }
然后定义一个实体的基类,在基类中处理主键生成。
java 代码
-
-
-
-
-
-
-
- public abstract class LongPKMongoEO extends BaseMongoEO {
-
- @Id
- Long _id;
-
- @Transient
- protected Datastore ds;
-
-
-
- public void setDs(Datastore ds) {
- this.ds = ds;
- }
-
- @PrePersist
- void prePersist() {
-
-
-
- if (_id == null) {
- String collName = ds.getCollection(getClass()).getName();
- Query<StoredSeqence> q = ds.find(StoredSeqence.class, "_id",
- collName);
- StoredSeqence ss = q.get();
- if(ss==null){
- ss = new StoredSeqence(collName);
- ss.setValue(1l);
- }else{
- ss.setValue(ss.getValue()+1);
- }
- ds.save(ss);
- _id=ss.value;
- }
- }
-
- public Long getId() {
- return _id;
- }
-
- }
这样自增长主键的生成的主要功能基本上已经完成了,具体如何使用,接下来将根据实际的项目再做介绍,请继续关注我的博客。
原文:http://www.po-soft.com/hi/yongtree/blog/2157
分享到:
相关推荐
今天闲着自己做了一个可以根据主键名称生成DBHelper类的小工具,现在把源码上传,适合初学Mongodb的朋友学习。
MongoDB Smasher - 一个基于MongoDB的小工具来生成随机数据集
golang mgo 代码自动生成器, 生成对 mongodb 的 CRUD 操作代码
Mongodb增加、删除和查询操作
mongodb集群分片操作以及增加acl,有什么问题联系我!
MongoDB的_id自动增长.pdf 学习资料 复习资料 教学资源
MongoDB自动备份脚本,自动删除几天前的备份,带全部注释
MongoDB 没有像 SQL 一样有自动增长的功能, MongoDB 的 _id 是系统自动生成的12字节唯一标识。 但在某些情况下,我们可能需要实现 ObjectId 自动增长功能。 由于 MongoDB 没有实现这个功能,我们可以通过编程的方式...
NULL 博文链接:https://achun.iteye.com/blog/1098450
MongoDB自动迁移脚本
springboot集成mongodb实现增删改查功能源码,以员工表为例,对员工表实现增岫改查,并提供了mongodb脚本
3、MongoDB增加 6 4、MongoDB修改 7 5、MongoDB删除 9 6、MongoDB分页 10 7、MongoDB模糊查询和其他条件查询 12 五、Mongoose(node使用)(前提安装好node环境有node基础) 13 1、连接 13 2、创建模式结构(Schema)...
使用C#开发,通过远程SSH的方式自动部署MongoDB副本集群,要求已安装MongoDB数据库,服务器是Linux操作系统
:seedling: greenleaf-用于MongoDB的简单,类型安全且易于使用的查询生成器 安装 要安装使用: go get github.com/slavabobik/greenleaf 快速范例 package main import ( "context" "github....
二、Nodejs 连接 MongoDb 数据库 二、Nodejs 查找 MongoDb 数据库集合 三、Nodejs 给 MongoDb 增加数据 四、Node
MongoDB安装并随windows开机自启,Windows下安装配置使用
本课程是一套关于MongoDB应用开发的实战性教程,名为《深入浅出MongoDB应用实战开发(基础、开发指南、系统管理、集群及系统架构)》,教程侧重于讲解MongoDB的常用特性及高级特性,从实际开发的角度出发对MongoDB...
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它...
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它...
MongoDB实验