Spring boot MongoDB实现自增序列

这篇具有很好参考价值的文章主要介绍了Spring boot MongoDB实现自增序列。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在某些特定的业务场景下,会需要使用自增的序列来维护数据,目前项目中因为使用MongoDB,顾记录一下如何使用MongoDB实现自增序列。

MongoDB自增序列原理

MongoDB本身不具有自增序列的功能,但是MongoDB的$inc操作是具有原子性的,因为操作的原子性,那么就可以通过$inc序列+1的值作用本次序列,实现自增序列。

实现自增序列

定义自增序列IdSequence.java

@Document(collection = "sequences")
@Data
public class IdSequence {
    @Id
    private String id;
    /**
     * 自增的序列
     */
    private long nextId;
}

定义自增序列类型枚举IdType.java

@Getter
@AllArgsConstructor
public enum IdType {
    /**
     * 图书
     */
    BOOK("book");
    private final String type;
}

定义获取自增序列辅助类IdHelper.java

@Component
public class IdHelper {
    private final MongoTemplate mongoTemplate;

    public IdHelper(MongoTemplate mongoTemplate) {
        this.mongoTemplate = mongoTemplate;
    }

    /**
     * 查询指定类型的自增序列
     *
     * @param idType 类型
     * @return 自增序列
     */
    public long nextId(IdType idType) {
        //构建查询对象
        Query query = Query.query(Criteria.where(LambdaUtil.getFieldName(IdSequence::getId)).is(idType.getType()));
        //构建自增条件
        Update update = new Update().inc(LambdaUtil.getFieldName(IdSequence::getNextId), 1L);
        //构建选项
        FindAndModifyOptions options = FindAndModifyOptions.options().upsert(true).returnNew(true);
        //查询自增序列
        IdSequence idSequence = mongoTemplate.findAndModify(query, update, options, IdSequence.class);
        //返回自增序列
        return Objects.requireNonNull(idSequence).getNextId();
    }
}

定义测试类

@RestController
@RequestMapping(value = "/id")
public class IdSequenceController {
    @Resource
    private IdHelper idHelper;

    @GetMapping(value = "/nextId")
    public long nextId() {
        return idHelper.nextId(IdType.BOOK);
    }

}

总结

使用MongoDB实现自增序列是基于MongoDB的$inc操作指令,经过测试100个并发下没有发现重复id的产生,但是还是建议使用MongoDB自己的Id生成策略,毕竟MongoDB作为非关系型数据库,如果维护一个自增序列,性能上肯定没有ObjectId好,而且分片情况下需要自己校验自增序列的唯一性,当然在某些特殊的业务场景下必须要使用自增序列的,也属于正常,如果大家有更好的方案,欢迎讨论。文章来源地址https://www.toymoban.com/news/detail-521625.html

到了这里,关于Spring boot MongoDB实现自增序列的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MongoDB文档-进阶使用-spring-boot整合使用MongoDB---MongoRepository完成增删改查

    阿丹:         之前学习了在MongoDB客户端上的MongoDB语句现在将MongoDB整合到spring项目。 MongoDB文档--基本概念_一单成的博客-CSDN博客 MongoDB文档--基本安装-linux安装(mongodb环境搭建)-docker安装(挂载数据卷)-以及详细版本对比_一单成的博客-CSDN博客 MongoDB文档--基本安装-linu

    2024年02月14日
    浏览(47)
  • 使用Spring Boot操作Redis、ES、MongoDB举例

    在Spring Boot应用程序中操作Redis通常涉及到使用Spring Data Redis,这是一个提供简便方法来操作Redis的库。以下是一个基本示例,演示如何在Spring Boot应用程序中集成和使用Redis: 步骤 1: 添加依赖项 首先,在你的 pom.xml 文件中添加Spring Data Redis的依赖项。 步骤 2: 配置Redis 在你的

    2024年01月25日
    浏览(40)
  • 2023年了,复习了一下spring boot配置使用mongodb

    MongoDB是一个基于分布式文件存储的开源数据库系统,使用C++语言编写。它是一个介于关系数据库和非关系数据库之间的产品,具有类似关系数据库的功能,但又有一些非关系数据库的特点。MongoDB的数据模型比较松散,采用类似json的bson格式,可以灵活地存储各种类型的数据

    2024年02月08日
    浏览(58)
  • 1024程序员节特辑 | Spring Boot实战 之 MongoDB分片或复制集操作

    Spring实战系列文章: Spring实战 | Spring AOP核心秘笈之葵花宝典 Spring实战 | Spring IOC不能说的秘密? 国庆中秋特辑系列文章: 国庆中秋特辑(八)Spring Boot项目如何使用JPA 国庆中秋特辑(七)Java软件工程师常见20道编程面试题 国庆中秋特辑(六)大学生常见30道宝藏编程面试题

    2024年02月08日
    浏览(82)
  • Spring Boot进阶(55):SpringBoot之集成MongoDB及实战使用 | 超级详细,建议收藏

            随着大数据时代的到来,数据存储和处理变得越来越重要。而MongoDB作为一种非关系型数据库,具有高效的数据存储和处理能力,被越来越多地应用于各种领域。尤其在Web应用开发中,SpringBoot框架已经成为了主流选择之一。在这篇文章中,我们将探讨如何将MongoD

    2024年02月17日
    浏览(47)
  • Spring Boot进阶(54):Windows 平台安装 MongoDB数据库 | 超级详细,建议收藏

            MongoDB是一种流行的文档型NoSQL数据库,它具有高性能、高可用性、可伸缩性等优点,因此被广泛应用于Web应用程序、分布式系统、云计算等领域。在Windows系统中安装和使用MongoDB也非常简单,只需要按照官方文档提供的步骤进行操作即可。在本篇文章中,我们将介

    2024年02月16日
    浏览(60)
  • Spring Data MongoDB实现@DBRef级联存储

    当使用上面的示例保存Person时,会报以下错误,原因是:被引用的对象的id属性为null 出现 MappingException 异常的原因: 被引用的对象在保存到数据库之前没有生成id。确保在保存被引用对象之前为其生成一个唯一的id。 被引用的对象在数据库中的id属性为null。在使用 @DBRef 进行查

    2024年02月12日
    浏览(39)
  • C#使用MongoDB-第二章 序列化

    这里在C#中所使用的连接MongoDB数据库的依赖库为 MongoDB.Driver ,使用前先到Nuget中进行安装。 默认情况下,在我们对MongoDB数据库进行CRUD时,MongoDB.Driver(以后简称驱动库)会自动为我们根据属性、属性类型,将实体类型转换为对应的BSON。 实体类 对应的BSON 1、主键Id 默认情况

    2024年01月22日
    浏览(51)
  • vue3 + tsrpc +mongodb 实现后台管理系统

    之前上线了一个vue后台管理系统,有小伙伴问我有没有后端代码,咱只是个小前端,这就有点为难我了。不过不能辜负小伙伴的信任,nodejs也可以啊,废话不多说,开搞!后端采用 TSRPC 框架实现 API 接口,前端采用 vue-manage-system 后台管理系统框架,数据库采用 mongodb。TSRPC 是

    2024年01月16日
    浏览(72)
  • 2. MongoDB分片集群架构实战-----MongoDB分片集群和多文档事务详解

    本文是按照自己的理解进行笔记总结,如有不正确的地方,还望大佬多多指点纠正,勿喷。 课程内容: 1.MongoDB分片集群架构及其原理分析 2.MongoDB分片集群环境搭建 3.MongoDB分片策略和数据均衡详解 4.写事务之writeConcern实战 5.读事务之readPreferencereadConcern实战 6.MongoDB多文档事务

    2024年02月11日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包