欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MongoDB自增ID

程序员文章站 2022-04-01 11:23:47
MongoDB默认保存的id是一个字符串,有时候我们业务需要一个数字类型的id或者其它字段的时候,会显的有些麻烦,这里给出一种解决方案。利用一个额外的表存储各个表的自增id,用表格示例如下,这个表命名为 mongoSequence:tableName(需要自增id的表名)seqtable11table22定义一个JavaBean: MongoSequence ,跟此表格对应:import org.springframework.data.mongodb...

MongoDB默认保存的id是一个ObjectId字符串,有时候我们业务需要一个自增ID的时候,会显的有些麻烦,这里给出一种解决方案。

利用一个额外的表存储各个表的自增id,用表格示例如下,这个表命名为 mongoSequence:

tableName(需要自增id的表名) seq (自增序列)
"table1" 1
"table2" 2

定义一个JavaBean: MongoSequence ,跟此表格对应:

import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection="mongoSequence")
public class MongoSequence {
	
	// 表名
	@Indexed(unique=true)
	private String tableName;
	
	// 自增的序列
	private long seq;

	public String getTableName() {
		return tableName;
	}

	public void setTableName(String tableName) {
		this.tableName = tableName;
	}

	public long getSeq() {
		return seq;
	}

	public void setSeq(long seq) {
		this.seq = seq;
	}
}

 

然后写一个工具类 MongoSeqUtil,用来获取所需要的表的id

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;

public class MongoSeqUtil {
	
	public static long getNextSeq(MongoTemplate mongoTemplate, String tableName) {
		if (tableName.trim().length() == 0) {
			throw new RuntimeException("Document注解的表名不能为空");
		}
		Query query = new Query(Criteria.where("tableName").is(tableName));
		Update update = new Update();
		update.inc("seq", 1); // 自增1,也可以作为参数传进来
		FindAndModifyOptions options = new FindAndModifyOptions();
		options.upsert(true); // 设置为不存在,则插入
		options.returnNew(true); // 设置为返回更新后的数据
		MongoSequence mongoSequence = mongoTemplate.findAndModify(query, update, options, MongoSequence.class);
		return mongoSequence.getSeq();
	}
}

传入MongoTemplate 和 需要自增的表名,则返回一个最新的序号,没有并发问题,inc是原子性操作。mongoSequence不需要提前插入数据。
MongoTemplate 参数也可以启动时候注入,这个看自己代码架构。

 

优化代码:
字符串参数tableName开发者可能会传错,则里面可能有很多脏数据,可以传Class的形式获取表格名,这样表格是跟JavaBean绑定的,获取此Class的Document注解,就可以获取tableName,优化后如下:

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.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;

public class MongoSeqUtil {
	
	public static long getNextSeq(MongoTemplate mongoTemplate, Class<?> clazz) {
		Document document = clazz.getAnnotation(Document.class);
		if (document == null) {
			throw new RuntimeException("请传入被@Document注解的类");
		}
		String tableName = document.collection();
		if (tableName.trim().length() == 0) {
			throw new RuntimeException("Document注解的表名不能为空");
		}
		Query query = new Query(Criteria.where("tableName").is(tableName));
		Update update = new Update();
		update.inc("seq", 1); // 自增1,也可以作为参数传进来
		FindAndModifyOptions options = new FindAndModifyOptions();
		options.upsert(true); // 设置为不存在,则插入
		options.returnNew(true); // 设置为返回更新后的数据
		MongoSequence mongoSequence = mongoTemplate.findAndModify(query, update, options, MongoSequence.class);
		return mongoSequence.getSeq();
	}
}

 

调用:

// 传入表名
long id = MongoSeqUtil.getNextSeq(mongoTemplate, "myTable");

// 传入Class
long id = MongoSeqUtil.getNextSeq(mongoTemplate, MyTable.class);

至此,MongoDB自增ID的方案就完成了。

 

另外还可以参考这个链接,原理是一致的: https://www.runoob.com/mongodb/mongodb-autoincrement-sequence.html

 

另外推荐一个开发者小工具网站,个人觉得里面的Json格式化功能很强大,报错很详细

https://tinyutil.com/

还可以输入表达式进行内容选取,对于复杂json非常多层级的内容展现非常用用处

MongoDB自增ID

本文章禁止转载, 可以链接,本文原始地址: https://blog.csdn.net/americaMan/article/details/107581136

本文地址:https://blog.csdn.net/americaMan/article/details/107581136