MongoDB自增ID

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的方案就完成了。

扫描二维码关注公众号,回复: 11441704 查看本文章

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

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

https://tinyutil.com/

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

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

猜你喜欢

转载自blog.csdn.net/americaMan/article/details/107581136