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, ...
随机推荐
- restframework安装及APIView分析
一.restframework的安装 方式一:pip3 install djangorestframework 方式二:pycharm图形化界面安装 方式三:pycharm命令行下安装(装在当前工程所 ...
- 前端js优化方案(二)持续更新
由于上篇篇幅过长,导致编辑出了问题,另开一篇文章继续: (4)减少迭代次数,最广为人知的一种限制循环迭代次数的模式被称为“达夫设备(Duff`s Device)” Duff`s Device的理念是: ...
- 由Cocos2d-x工程入口窥见代理模式
关于设计模式(Design Pattern),自从“四人帮”第一次在<Design Patterns: Elements of Reusable Object-Oriented Software ...
- Python+selenium之下载文件
一.Firefox文件下载 Web容许我们设置默认的文件下载路劲,文件会自动下载并且存放在指定的目录下. from selenium import webdriver import os fp = w ...
- python基础教程总结14——测试
1. 先测试,后编码 对程序的各个部分建立测试也是非常重要的(这也称为单元测试).测试驱动编程:Test-driven programming 1)精确的需求说明: 程序设计的理念是以编写测试程序开始 ...
- 给广大码农分享福利:一个业界良心的github仓库,中文计算机资料
我今天查资料时无意发现的,https://github.com/CyC2018/CS-Notes 这个仓库包含了下列几个维度的计算机学习资料: 深受国内程序员喜爱,已经有超过3万多star了. 1. ...
- 5分钟部署一个Hello World Servlet到CloudFoundry
首先从我的Github下载我写好的hello world Servlet到本地. 安装Maven,然后执行命令行mvn clean install,确保build成功,在项目根目录的target文件夹 ...
- UVA 1615 Highway 高速公路 (区间选点)
题意:在一条线段上选出尽量少的点,使得和所有给出的n个点距离不超过D. 分别计算出每个点在线段的满足条件的区间,然后就转化成了区间选点的问题了,按照右端点排序,相同时按照左端点排序,按照之前的排序一定 ...
- python_80_模块定义导入优化实例
运行结果 __import__作用: 同import语句同样的功能,但__import__是一个函数,并且只接收字符串作为参数,所以它的作用就可想而知了.其实import语句就是调用这 ...
- 用 label 控制 Pod 的位置
默认配置下,Scheduler 会将 Pod 调度到所有可用的 Node.不过有些情况我们希望将 Pod 部署到指定的 Node,比如将有大量磁盘 I/O 的 Pod 部署到配置了 SSD 的 Nod ...