MongoDB学习-->设置通用的自增ID替代ObjectId
插入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的更多相关文章
- MongoDB学习总结(二) —— 基本操作命令(增删改查)
上一篇介绍了MongoDB在Windows平台下的安装,这一篇介绍一下MongoDB的一些基本操作命令. 下面我们直奔主题,用简单的实例依次介绍一下. > 查看所有数据库 (show dbs) ...
- 设置(更改)Mysql 自增ID的起始值
SELECT * FROM segwords WHERE id>790511 DELETE FROM segwords WHERE id>790511 #下面这句是设置的 ALTER TA ...
- MongoDB学习day07--mongoose入门,数据库增删改查,默认参数,模块化
一.mongoose介绍 Mongoose 是在 node.js 异步环境下对 mongodb 进行便捷操作的对象模型工具. Mongoose 是 NodeJS 的驱动, 不能作为其他语言的驱动. M ...
- mongodb如何设置主键自增
function getNextSequence(name){ var ret = db.counters.findAndModify({ query: { _id: name}, update:{ ...
- PHP操作MongoDB学习(转)
1 mongodb启动时,设置启动项 C:\>mongodb\bin\mongod --config C:\mongodb.conf 其中mongodb.conf为: dbpath = ...
- MongoDB学习-->命令行增删改查&JAVA驱动操作Mongodb
MongoDB 是一个基于分布式文件存储的数据库. 由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关 ...
- mongoDB 学习笔记纯干货(mongoose、增删改查、聚合、索引、连接、备份与恢复、监控等等)
最后更新时间:2017-07-13 11:10:49 原始文章链接:http://www.lovebxm.com/2017/07/13/mongodb_primer/ MongoDB - 简介 官网: ...
- MongoDB学习之--增删改查(1)
本文是对mongodb学习的一点笔记,主要介绍最简单的增删改操作,初学,看着API,有什么错误,希望大家指正:(使用官方驱动) 1.增 增加操作是最简单的,构造bsonDcument插入即可: 方式1 ...
- 日志、字段备注查询、自增ID联系设置、常用存储过程
-----获取数据字典SQL(表字段说明)SELECT [Table Name] = OBJECT_NAME(c.object_id), [Column Name] = c.name, ...
随机推荐
- nodejs 实践:express 最佳实践 (一) 项目结构
express 最佳实践 (一) 第二篇: express 最佳实践(二):中间件 最近,一直在使用 nodejs 做项目,对 nodejs 开发可以说深有体会. 先说说 nodejs 在业务中的脚色 ...
- jQuery知识点小结
博主之前学习一段时间后做了点Demo,借此机会发出来分享,其实学jQuery只要简单看看文档即可,但有些细枝末节的东西文档会默认使用者是了解的,所以还是得系统学习系统训练:Talk is cheap, ...
- columns分栏与flex弹性盒模型
columns 分栏 值:column-width:设置每列的宽度 column-count:设置列数 例:columns{200px 3} 列数和宽度固定 co ...
- ES6学习(2)
Set和Map数据结构 ES6 提供了新的数据结构 Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. Set 本身是一个构造函数,用来生成 Set 数据结构. const s = new ...
- 链接服务器"(null)"的 OLE DB 访问接口 "SQLNCLI10" 返回了消息 "Cannot start more transactions on this session."
开发同事反馈一个SQL Server存储过程执行的时候,报"链接服务器"(null)"的 OLE DB 访问接口 "SQLNCLI10" 返回了消息 ...
- Jmeter监控内存及CPU等
在进行性能测试时需要查看内存和CPU等信息来判断系统瓶颈,关于CPU和内存的监控,goole开发了一款专门的jmeter插件,弥补了Jmeter这方面的不足,下面来介绍这款插件-JmeterPlugi ...
- 【Python图像特征的音乐序列生成】思路的转变
关于生成网络这边,可能会做一个深度的受限玻尔兹曼机,这样可以保证生成的音乐不会太相似. 情绪识别网络和生成网络的耦合,中间变量可能直接就是一个one-hot向量,用来标注指定的情绪,不做成坐标那种难以 ...
- 并发教程--JAVA5中 计数信号量(Counting Semaphore)例子
并发教程--JAVA5中 计数信号量(COUNTING SEMAPHORE)例子 本文由 TonySpark 翻译自 Javarevisited.转载请参见文章末尾的要求. Java中的计数信息量(C ...
- PAT (Basic Level) Practise (中文)- 1014. 福尔摩斯的约会 (20)
http://www.patest.cn/contests/pat-b-practise/1014 1014. 福尔摩斯的约会 (20) 时间限制 50 ms 内存限制 65536 kB 代码长度限制 ...
- python - 日期处理模块
首先就是模块的调用,很多IDE都已经安装好了很多Python经常使用到的模块,所以我们暂时不需要安装模块了. ? 1 2 3 import datetime import time import ca ...