区块链技术博客
www.b2bchain.cn

MongoDB自增ID的讲解

这篇文章主要介绍了MongoDB自增ID的讲解,通过具体代码讲解7752并且分析了MongoDB自增ID的讲解的详细步骤与相关技巧,需要的朋友可以参考下

本文实例讲述了MongoDB自增ID的讲解。分享给大家供大家参考文章查询地址https://www.b2bchain.cn/7752.html。具体如下:

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://www.b2bchain.cn/7752.html

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » MongoDB自增ID的讲解
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们