插入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. C++程序中调用WebService的实现

    前言 因为最近的项目中需要运用到在MFC程序中调用WebService里面集成好了的函数,所以特意花了一天的时间来研究WebService的构建以及如何在MFC的程序中添加Web引用,进而来实现在C+ ...

  2. Android笔记--View绘制流程源码分析(二)

    Android笔记--View绘制流程源码分析二 通过上一篇View绘制流程源码分析一可以知晓整个绘制流程之前,在activity启动过程中: Window的建立(activit.attach生成), ...

  3. Lucene-如何编写Lucene程序

    Lucene版本:7.1 使用Lucene的关键点 创建文档(Document),添加文件(Field),保存了原始数据信息: 把文档加入IndexWriter: 使用QueryParser.pars ...

  4. 配置文件无法修改(以修改my-default.ini为例)

    现象: 保存my-default.ini时如果提示“拒绝访问”,右击my-default.ini文件 解决办法: 属性—>安全—>修改权限

  5. 洛谷 P1784 数独

    题目描述 数独是根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个粗线宫内的数字均含1-9,不重复.每一道合格的数独谜题都有且仅有唯一答案,推理方法也以此为基础,任何无 ...

  6. 微软Bot Framework文档中,关于Sign-in Card的一处代码错误及更正

    Bot Framework文档出错处网址:https://docs.botframework.com/en-us/csharp/builder/sdkreference/attachments.htm ...

  7. jquery.restrictFieldLength.js

    1.参考资料 http://www.cnblogs.com/aarond/archive/2013/08/02/3234042.html 2.使用举例 //字符控制 $(function () { $ ...

  8. 抓取GridView "编辑"模式下,TextBox修改后的数值

    [FAQ]抓取GridView "编辑"模式下,TextBox修改后的数值 -- ASP.NET专题实务「上集」Ch.10 抓取GridView "编辑"模式下 ...

  9. .net代码获取节点以及读取属性

    获取配置文件的节点,可以使用System.Configuration.ConfigurationManager.GetSection方法获取指定的节点,以sessionstate节点为例,如果需要获取 ...

  10. 2002-2003 ACM-ICPC Northeastern European Regional Contest (NEERC 02) A Amusing Numbers (数学)

    其实挺简单的.先直接算出之前已经排在k这个数前面的数字.比如543是三位的,那么100~543都是可以的,两位的10~54. 如果还需要往前面补的话,那么依次考虑1000~5430,5430是上界不能 ...