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的方案就完成了。
另外还可以参考这个链接,原理是一致的: https://www.runoob.com/mongodb/mongodb-autoincrement-sequence.html
另外推荐一个开发者小工具网站,个人觉得里面的Json格式化功能很强大,报错很详细
还可以输入表达式进行内容选取,对于复杂json非常多层级的内容展现非常用用处
本文章禁止转载, 可以链接,本文原始地址: https://blog.csdn.net/americaMan/article/details/107581136
本文地址:https://blog.csdn.net/americaMan/article/details/107581136
上一篇: Linux nginx的安装以及环境配置
下一篇: C#中使用MVC架构(四)