java mongodb id自增长_【Mongodb】后台主键_id自增(Java版本)

通过创建序列计数文档并利用SpringBoot事件监听,实现Java中MongoDB的_id自增长。详细步骤包括创建序列计数类、自定义注解、实体类、监听类,并测试其在并发情况下的安全性。
摘要由CSDN通过智能技术生成

设计思路

创建一个序列计数的文档,记录所有文档的名称和序列值,序列值设置默认0,每次进行插入操作的时候,序列值+1,作为本次操作的id。

程序实现

开发环境:IntelliJ IDEA+JAVA8+SpringBoot

1 创建序列计数类,用于存储各文档以及文档序列值。

f87f29048035e7ec4e8a760eb4a16497.png

2 自定义注解

87f2126a00c6872639ab61e1d8b950a6.png

3 定义实体类,自己要实现自增的实体类(get、set),与文档一一对应

1495fabba211cb847b700b31e4f120c8.png

4 定义监听类SaveEventListener。重写save方法。在每次存储时候进行主键自增

30e770e28c94be37267a9b2dd473070c.png

5.然后测试(中间的111113删除掉了)

5de920d898d16096387369431b46a0ed.png        

dd2c81e413c59dc25500e5d8402321d0.png   

7182b59dd6999a86d2bfecc9cb2c7ea4.png

注意

如果根据主键查询的话要进行转化:

d1092189b2527056453d2bec8a89bbfe.png

到此,MongoDB的主键自增就完成了。

总结

经过测试,以上流程没有问题,会得到期望的结果,但是有以下几点需要注意:

(1)为什么我在Student类中为主键赋了一个默认值0L?

答:我在此自增方式原作者文章中发现这么一句,“注意自增ID的类型不要定义成Long这种包装类,mongotemplate的源码里面对主键ID的类型有限制”。测试后发现,如果ID定义为原生类型确实是没有问题的。当ID定义为包装类的情况下,如果在onBeforeConvert方法之前没有给ID设置值,是会报错的,我猜测可能是因为内部转换类型时如果ID是空值而无法转换引起的,因此,我赋了一个默认值,这样就不会报错了,包装类也可以使用(不过这样好像跟原生类型就没什么区别了,没什么意义)。

(2)这个监听器会不会影响修改操作?

答:测试发现,不会影响,水平有限,本人也不知作何解释,不要打我……

(3)这种方式会有并发问题吗?

答:不会的!根据官方文档说明,findAndModify一个原子性操作,不过有这么一句“When the findAndModify command includes the upsert: true option and the query field(s) is not uniquely indexed, the command could insert a document multiple times in certain circumstances.”,大概意思是说当查询和更新两个操作都存在时,如果查询的字段没有唯一索引的话,该命令可能会在某些情况下更新/插入 文档多次,参考链接:戳我戳我。以上演示的是只存储了集合所对应的实体类的短名称,短名称是会重复的,所以这种方法不妥,还是记录长名称吧

菜鸟程序员,若有需修正之处,望指正~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值