插入mongodb数据时,会为其分配一个随机id,想要设置通用的自增id,可以进行以下操作

1.创建自增序列

 package com.tangzhe.autoid;

 import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field; /**
* Created by 唐哲
* 2018-03-14 21:26
* 自增序列
*/
@Document(collection = "sequence")
@Data
public class Sequence { @Id
private String id; //序列的id @Field("coll_name")
private String collName; //coll的name @Field("seq_id")
private Long seqId; //coll的id,自增id }

2.创建AutoId注解

 package com.tangzhe.autoid;

 import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; /**
* Created by 唐哲
* 2018-03-14 21:55
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface AutoId {
}

3.创建需要使用自增ID的实体类

 package com.tangzhe.autoid;

 import lombok.Data;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field; /**
* Created by 唐哲
* 2018-03-14 21:56
*/
@Document(collection = "stu_info")
@Data
public class StuInfo { @AutoId
private Long id; @Field("name")
private String name; }

4.自增id监听器

 package com.tangzhe.autoid;

 import java.lang.reflect.Field;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.FindAndModifyOptions;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.event.AbstractMongoEventListener;
import org.springframework.data.mongodb.core.mapping.event.BeforeConvertEvent;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.util.ReflectionUtils;
import org.springframework.util.ReflectionUtils.FieldCallback; /**
* 自增id监听器
*/
public class SaveMongoEventListener extends AbstractMongoEventListener<Object> { @Autowired
private MongoTemplate mongoTemplate; @Override
public void onBeforeConvert(BeforeConvertEvent<Object> event) {
if (event != null && event.getSource() != null) {
ReflectionUtils.doWithFields(event.getSource().getClass(), new FieldCallback() { @Override
public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException {
if (field.isAnnotationPresent(AutoId.class)) {
String collName = event.getSource().getClass().getSimpleName();
if (event.getSource().getClass().isAnnotationPresent(Document.class)) {
collName = event.getSource().getClass().getAnnotation(Document.class).collection();
}
field.set(event.getSource(), getNextId(collName));
}
} });
}
} public Long getNextId(String collName) {
Query query = Query.query(Criteria.where("collName").is(collName));
Update update = new Update().inc("seqId", 1);
FindAndModifyOptions options = FindAndModifyOptions.options().upsert(true).returnNew(true);
return mongoTemplate.findAndModify(query, update, options, Sequence.class).getSeqId();
} }

5.测试自增ID

 package com.tangzhe.autoid;

 import com.mongodb.BasicDBObject;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.mongodb.core.FindAndModifyOptions;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.test.context.junit4.SpringRunner; /**
* Created by 唐哲
* 2018-03-14 21:29
* 自增id测试
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class AutoIdTest { @Autowired
private MongoTemplate mongoTemplate; //@Test
public void testAutoId() {
Query query = Query.query(Criteria.where("collName").is("stu_info"));
Update update = new Update().inc("seqId", 1);
FindAndModifyOptions options = FindAndModifyOptions.options().upsert(true).returnNew(true);
Long stuInfoId = mongoTemplate.findAndModify(query, update, options, Sequence.class).getSeqId(); mongoTemplate.getCollection("stu_info").save(new BasicDBObject("_id", stuInfoId).append("name", "zhangsan"));
} /**
* 测试自增id监听器
*/
//@Test
public void testSaveMongoEventListener() {
StuInfo stuInfo = new StuInfo();
stuInfo.setName("lisi");
mongoTemplate.save(stuInfo);
} }

MongoDB学习-->设置通用的自增ID替代ObjectId的更多相关文章

  1. MongoDB学习总结(二) —— 基本操作命令(增删改查)

    上一篇介绍了MongoDB在Windows平台下的安装,这一篇介绍一下MongoDB的一些基本操作命令. 下面我们直奔主题,用简单的实例依次介绍一下. > 查看所有数据库 (show dbs) ...

  2. 设置(更改)Mysql 自增ID的起始值

    SELECT * FROM segwords WHERE id>790511 DELETE FROM segwords WHERE id>790511 #下面这句是设置的 ALTER TA ...

  3. MongoDB学习day07--mongoose入门,数据库增删改查,默认参数,模块化

    一.mongoose介绍 Mongoose 是在 node.js 异步环境下对 mongodb 进行便捷操作的对象模型工具. Mongoose 是 NodeJS 的驱动, 不能作为其他语言的驱动. M ...

  4. mongodb如何设置主键自增

    function getNextSequence(name){ var ret = db.counters.findAndModify({ query: { _id: name}, update:{ ...

  5. PHP操作MongoDB学习(转)

    1  mongodb启动时,设置启动项 C:\>mongodb\bin\mongod --config C:\mongodb.conf 其中mongodb.conf为:    dbpath = ...

  6. MongoDB学习-->命令行增删改查&JAVA驱动操作Mongodb

    MongoDB 是一个基于分布式文件存储的数据库. 由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关 ...

  7. mongoDB 学习笔记纯干货(mongoose、增删改查、聚合、索引、连接、备份与恢复、监控等等)

    最后更新时间:2017-07-13 11:10:49 原始文章链接:http://www.lovebxm.com/2017/07/13/mongodb_primer/ MongoDB - 简介 官网: ...

  8. MongoDB学习之--增删改查(1)

    本文是对mongodb学习的一点笔记,主要介绍最简单的增删改操作,初学,看着API,有什么错误,希望大家指正:(使用官方驱动) 1.增 增加操作是最简单的,构造bsonDcument插入即可: 方式1 ...

  9. 日志、字段备注查询、自增ID联系设置、常用存储过程

    -----获取数据字典SQL(表字段说明)SELECT     [Table Name] = OBJECT_NAME(c.object_id),     [Column Name] = c.name, ...

随机推荐

  1. SequenceFile和MapFile

    HDFS和MR主要针对大数据文件来设计,在小文件处理上效率低.解决方法是选择一个容器,将这些小文件包装起来,将整个文件作为一条记录,可以获取更高效率的储存和处理,避免多次打开关闭流耗费计算资源.hdf ...

  2. telegraf1.8+influxdb1.6+grafana5.2 环境搭建 结合JMeter3.2

    telegraf1.8+influxdb1.6+grafana5.2 环境搭建 结合JMeter3.2 参考地址:https://blog.csdn.net/laisinanvictor/articl ...

  3. javaSe-线程

    package com.java.chap09.sec02; public class Thread1 extends Thread{ private int baoZi=1; private Str ...

  4. codeforce Gym 100342H Hard Test (思考题)

    题意:构造让Dijkstra单源最短路算法有效松弛次数最多的数据... 题解:构造,题意换种说法就是更新晚的路径要比更新早的路径短.因为所有点都会更新一次,那么按照更新时间形成一条链,即到最后一个点的 ...

  5. Android(java)学习笔记122:BroadcastReceiver之 有序广播和无序广播(BroadcastReceiver优先级)

    之前我们在Android(java)学习笔记178中自定义的广播是无序广播,下面我们要了解一下有序广播: 1. 我们首先了解一下有序广播和无序广播区别和联系? (1)有序广播> 接受者有优先级, ...

  6. IOS CoreData 多表查询(下)

    http://blog.csdn.net/fengsh998/article/details/8123392 在iOS CoreData中,多表查询上相对来说,没有SQL直观,但COREDATA的功能 ...

  7. ECshop安装提示cls_image::gd_version() 和不支持JPEG

    ecshop版本:ECShop_V2.7.3_UTF8_release1106php 版本 5.5--------------------------------------------------- ...

  8. cpp代码调试,调试扑克牌的代码

    #include <iostream> #include <vector> #include <algorithm> using namespace std; cl ...

  9. 剑指offer22 栈的压入、弹出序列

    写的一个代码,虽然正确通过了,但我觉得会报vector越界的错误 class Solution { public: bool IsPopOrder(vector<int> pushV,ve ...

  10. sqlite 新建实体时出错

    解决方式 手动下载 问题原因