插入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. 选择控件js插件和使用方法

    记录一下 选择控件js插件 /* * 滚动控件,包含地址选择.时间选择.自定义单选 */ //js_inputbox input 输入框 //js_pickviewselect 下拉单项选择 //js ...

  2. git-gui:使用终端打开以后出现错误提示 Spell checking is unavable

    参考链接:http://www.lai18.com/content/10706682.html 安装了git-gui,打开以后出现以下提示: Spell checking is unavable: e ...

  3. 初学Vue.js(2.x版本)

    首先肯定是打开官网查看文档了,没想到我太高估了自己,看的我头晕也不知道到底说了个啥.没办法,只能另寻他法,好在有菜鸟教程.然而我还是想多了,不稀饭一点点看下去,只想快点明白它到底说了个啥.嗯,找来找去 ...

  4. android配置android studio not found target android-*.的问题

    列:not found target android-25, 打开下载android SDK的工具栏,找到android-25版本下载到你本地的sdk路径下就OK了.

  5. Installing Apache, PHP, and MySQL on Mac OS X

    I have installed Apache, PHP, and MySQL on Mac OS X since Leopard. Each time doing so by hand. Each ...

  6. ABAP和Java单例模式的攻防

    ABAP CLASS zcl_jerry_singleton DEFINITION PUBLIC FINAL CREATE PRIVATE . PUBLIC SECTION. INTERFACES i ...

  7. Codeforces Round #321 (Div. 2) B. Kefa and Company (尺取)

    排序以后枚举尾部.尺取,头部单调,维护一下就好. 排序O(nlogn),枚举O(n) #include<bits/stdc++.h> using namespace std; typede ...

  8. UVA 690 PipelineScheduling 位运算+dfs+剪枝

    一开始最容易想到间隔最多为n,但是结点还是太多了,需要优化. 预处理:预判一下并保存下一个可以放的位置距离之前的距离.这样可以减少很多判断. 最优化剪枝:如果当前长度+剩下没放的程序*最短间隔如果大于 ...

  9. 重新postgresql出现错误:Problem running post-install step. Installation may not complete correctly. The database cluster initialisation failed.

    以前正常使用的postgresql,今天出现问题:报*.dll错误.百度了一下,只能重新安装 . 在重新安装过程中报:Problem running post-install step. Instal ...

  10. openstack keystone修改horizon密码

    命令行修改密码:token在/etc/keystone/keystone.conf中的一个admin_token export OS_SERVICE_TOKEN=165a1766c12a497b8fb ...