MongoDB教程(二十三):关于MongoDB自增机制

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快!

文章目录

      • 引言
      • 一、MongoDB 默认的ObjectId
      • 二、实现自动增长ID
        • 1. 创建自增ID文档
        • 2. 获取并更新自增ID
      • 三、案例代码:实现自增ID
        • 1. 创建自增ID文档
        • 2. 获取并更新自增ID
        • 3. 插入订单
      • 四、并发场景下的自增ID
        • 1. 使用锁机制
        • 2. 使用事务
      • 五、结论

引言

在MongoDB中,自动生成或自动增长的ID是许多应用场景中的常见需求,特别是在需要连续编号的情况下。尽管MongoDB默认使用ObjectId作为文档的主键,但在某些情况下,开发者可能需要实现自定义的自增ID机制。本文将深入探讨如何在MongoDB中实现自动增长的ID,并通过具体的案例代码展示这一过程的每一个细节。

一、MongoDB 默认的ObjectId

MongoDB 默认使用ObjectId作为文档的_id字段。ObjectId是一个12字节的BSON类型,由以下四个部分组成:

  1. 时间戳(4字节):记录ObjectId创建时的时间,单位为秒。
  2. 机器标识符(3字节):表示生成ObjectId的机器,前两字节是网络字节序的机器ID,后一字节是进程ID。
  3. 计数器(2字节):每次在同一台机器同一进程中生成新的ObjectId时,计数器会递增。
  4. 随机数(3字节):增加随机性,降低冲突概率。

二、实现自动增长ID

在某些场景下,如订单编号、流水号等,需要使用连续的数字作为ID。MongoDB 不直接支持自增ID,但可以通过创建一个文档来模拟实现。

1. 创建自增ID文档

首先,需要在数据库中创建一个用于存储自增ID的文档。

db.auto_incr_ids.insert({ _id: "orders", sequence_value: 0 });

这里,orders 是自增ID的名称,sequence_value 是当前的ID值。

2. 获取并更新自增ID

每当需要一个新的自增ID时,可以通过原子操作获取并更新该文档。

db.auto_incr_ids.update({ _id: "orders" },{ $inc: { sequence_value: 1 } },{ upsert: true, new: true }
);

这里,$inc 操作符用于增加 sequence_value 的值,upsert 选项表示如果文档不存在,则创建新文档。

三、案例代码:实现自增ID

假设我们正在开发一个电子商务平台,需要为每个订单生成唯一的自增ID。

1. 创建自增ID文档
db.auto_incr_ids.insert({ _id: "order_numbers", sequence_value: 0 });
2. 获取并更新自增ID
function getNextSequence(name) {let result = db.auto_incr_ids.findOneAndUpdate({ _id: name },{ $inc: { sequence_value: 1 } },{ upsert: true, new: true });return result.sequence_value;
}let orderId = getNextSequence("order_numbers");
console.log(orderId);

这里,getNextSequence 函数用于获取下一个自增ID。

3. 插入订单
db.orders.insertOne({order_number: getNextSequence("order_numbers"),customer_name: "John Doe",items: [{ product: "T-shirt", quantity: 2 },{ product: "Jeans", quantity: 1 }],total_amount: 99.99
});

四、并发场景下的自增ID

在高并发场景下,直接使用 findOneAndUpdate 可能会遇到竞态条件。为了确保线程安全,可以使用锁机制或事务来处理。

1. 使用锁机制
const session = db.getMongo().startSession();
session.startTransaction();try {let result = db.auto_incr_ids.findOneAndUpdate({ _id: "order_numbers" },{ $inc: { sequence_value: 1 } },{ upsert: true, new: true, session });session.commitTransaction();
} catch (e) {session.abortTransaction();
} finally {session.endSession();
}
2. 使用事务

在MongoDB 4.0及以上版本,可以使用事务来确保操作的原子性。

const session = db.getMongo().startSession();
session.startTransaction();try {let result = db.auto_incr_ids.findOneAndUpdate({ _id: "order_numbers" },{ $inc: { sequence_value: 1 } },{ upsert: true, new: true, session });session.commitTransaction();
} catch (e) {session.abortTransaction();
} finally {session.endSession();
}

五、结论

自增ID机制非常适合需要连续编号的场景,如订单号、发票号等。需要注意的是,在高并发环境下,要确保并发安全性,可以使用锁机制或事务来处理。


喜欢博主的同学,请给博主一丢丢打赏吧↓↓↓您的支持是我不断创作的最大动力哟!感谢您的支持哦😘😘😘
打赏下吧

💝💝💝如有需要请大家订阅我的专栏【MongoDB系列】哟!我会定期更新相关系列的文章
💝💝💝关注!关注!!请关注!!!请大家关注下博主,您的支持是我不断创作的最大动力!!!

MongoDB相关文章索引文章链接
MongoDB教程(一):Linux系统安装mongoDB详细教程MongoDB教程(一):Linux系统安装mongoDB详细教程
MongoDB教程(二):mongoDB引用shellMongoDB教程(二):mongoDB引用shell
MongoDB教程(三):mongoDB用户管理MongoDB教程(三):mongoDB用户管理
MongoDB教程(四):mongoDB索引MongoDB教程(四):mongoDB索引
MongoDB教程(五):mongoDB聚合框架MongoDB教程(五):mongoDB聚合框架
MongoDB教程(六):mongoDB复制副本集MongoDB教程(六):mongoDB复制副本集
MongoDB教程(七):mongoDB分片MongoDB教程(七):mongoDB分片
MongoDB教程(八):mongoDB数据备份与恢复MongoDB教程(八):mongoDB数据备份与恢复
MongoDB教程(九):java集成mongoDBMongoDB教程(九):java集成mongoDB
MongoDB教程(十):Python集成mongoDBMongoDB教程(十):Python集成mongoDB
MongoDB教程(十一):MongoDB关系管理与文档关联MongoDB教程(十一):MongoDB关系管理与文档关联
MongoDB教程(十二):MongoDB数据库索引MongoDB教程(十二):MongoDB数据库索引
MongoDB教程(十四):MongoDB查询分析MongoDB教程(十四):MongoDB查询分析
MongoDB教程(十五):MongoDB原子操作MongoDB教程(十五):MongoDB原子操作
MongoDB教程(十六):MongoDB高级索引MongoDB教程(十六):MongoDB高级索引
MongoDB教程(十七):MongoDB主键类型ObjectIdMongoDB教程(十七):MongoDB主键类型ObjectId
MongoDB教程(十八):MongoDB MapReduceMongoDB教程(十八):MongoDB MapReduce
MongoDB教程(十九):MongoDB全文检索MongoDB教程(十九):MongoDB全文检索
MongoDB教程(二十):MongoDB正则表达式MongoDB教程(二十):MongoDB正则表达式
MongoDB教程(二十一):MongoDB大文件存储GridFSMongoDB教程(二十一):MongoDB大文件存储GridFS
MongoDB教程(二十二):MongoDB固定集合MongoDB教程(二十二):MongoDB固定集合

❤️❤️❤️觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/51089.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字孪生在奥运会上的应用

数字孪生是一种精确的虚拟空间表示,能够实时模拟场馆内的各种变化或场景。国际奥委会正在确定高价值的应用案例和技术要求,将应用案例分为六个主要领域:场馆规划、利益相关者支持与参与、操作准备、粉丝体验、遗产和运营效率。每个案例将基于…

【前端 13】Vue快速入门

Vue快速入门 在现代Web开发中,尽管通过HTML、CSS和JavaScript我们能够构建出美观且功能丰富的页面,但随着项目规模的增大,这种传统的开发方式在效率上逐渐显得力不从心。为了提高开发效率,前端开发者们引入了多种框架和库&#x…

MySQL环境的配置文件json

突然了解到,使用json文件去进行环境的配置,这样修改参数的时候就只需要去改json文件中的内容,不需要去修改代码中的内容,其他人的MySQL和我的MySQL也不同,这时其他人只需要修改json文件中的内容,清晰明了&a…

基于STC8H系列单片机的定时器系统

基于STC8H系列单片机的定时器系统 STC8H4K64TL单片机介绍STC8H4K64TL单片机管脚图(48个引脚)STC8H4K64TL单片机串口仿真与串口通信STC8H4K64TL单片机管脚图(32个引脚)STC8H4K64TL单片机管脚图(20个引脚)STC…

Apollo使用(3):分布式docker部署

Apollo 1.7.0版本开始会默认上传Docker镜像到Docker Hub,可以按照如下步骤获取 一、获取镜像 1、Apollo Config Service 获取镜像 docker pull apolloconfig/apollo-configservice:${version} 我事先下载过该镜像,所以跳过该步骤。 2、Apollo Admin S…

计算机网络-配置路由器ACL(访问控制列表)

配置访问控制列表ACL 拓扑结构 拓扑结构如下: 要配置一个ACL,禁止PC0访问PC3,禁止PC4访问PC0,其它正常。 配置Router0 配置接口IP地址: interface fastethernet 0/0 ip address 192.168.1.1 255.255.255.0 no shu…

第三部分 图论 - 第2章 最小生成树

定义 首先我们先了解下生成树的定义: 无向图中,一个连通图的最小连通子图称作该图的生成树(不能带环,保持连通,但边要尽可能的少)。 有n个顶点的连通图的生成树有n个顶点和n-1条边。 那么最小生成树和生成…

决策树 和 集成学习、随机森林

决策树是非参数学习算法,可以解决分类问题,天然可以解决多分类问题(不同于逻辑回归或者SVM,需要通过OVR,OVO的方法),也可以解决回归问题,甚至是多输出任务,并且决策树有非…

国内NAT服务器docker方式搭建rustdesk服务

前言 如果遇到10054,就不要设置id服务器!!! 由于遇到大带宽,但是又贵,所以就NAT的啦,但是只有ipv4共享和一个ipv6,带宽50MB(活动免费会升130MB~) https://bigchick.xyz/aff.php?aff322 月付-5 循环 :CM-CQ-Monthly-5 年付-60循环:CM-CQ-Annually-60官方…

数据结构第三讲:单链表的实现

数据结构第三讲:单链表的实现 1.什么是单链表2. 节点3.单链表的实现3.1节点的结构3.2打印单链表3.3申请一个新节点3.4单链表尾部插入3.5单链表头部插入3.6单链表的尾部删除3.7单链表头部删除3.8查找3.9在指定位置之前插入数据3.10在指定位置之后插入数据3.11删除pos…

VS+opencv+环境配置

下载opencv库。 版本 - OpenCV 下载完了是一个exe文件,(可以更换目录)直接双击,也就是压缩。 vs配置: 调试-调试属性 点编辑,加入这两个,路径根据自己的opencv库 3、链接器 测试:…

在Postman中引用JS库

前言 在做接口测试时,出于安全因素,请求参数需要做加密或者加上签名才能正常请求,例如:根据填写的请求参数进行hash计算进行签名。postman作为主流的接口调试工具也是支持请求预处理的,即在请求前使用JavaScript脚本对…

Redis:AOF持久化

1. 简介 以日志的形式来记录每个写操作,将redis执行的每个写操作记录下来(读操作不记录),只需追加文件但不可以改写文件,redis启动之初会重新构建数据,即redis重启后会将日志中的所有写指令重新执行一遍以达…

扰动观测器DOB设计及其MATLAB/Simulink实现

扰动观测器(Disturbance Observer, DOB)是一种在控制系统中用于估计和补偿未知扰动的重要工具,以增强系统的鲁棒性和稳定性。其设计过程涉及系统建模、观测器结构设计以及控制律的调整。 扰动观测器设计原理 系统建模: 首先,需要建立被控对象的数学模型,明确系统的状态变…

2024第八届全国职工职业技能大赛“网络与信息安全管理员”赛项技术文件及任务书

2024第八届全国职工职业技能大赛“网络与信息安全管理员”赛项技术文件及任务书 一、赛项概述:二、竞赛形式:三、竞赛规则四、竞赛样题4.1、第一场4.1.2、实操闯关赛4.2、第二场4.3、第三场 需要培训可以私信博主 欢迎交流学习! [X] &#x1…

【深入理解SpringCloud微服务】深入理解nacos

【深入理解SpringCloud微服务】深入理解nacos Nacos服务注册内存注册表内存注册表的更新通知客户端服务变更、服务同步、健康检查2.x版本nacos的变化 Nacos服务注册 spring-cloud-alibaba-nacos-discovery通过实现spring-cloud-commons规范定义的接口,完成nacos接入…

昇思25天学习打卡营第11天|xiaoyushao

今天分享ResNet50迁移学习。 在实际应用场景中,由于训练数据集不足,所以很少有人会从头开始训练整个网络。普遍的做法是,在一个非常大的基础数据集上训练得到一个预训练模型,然后使用该模型来初始化网络的权重参数或作为固定特征提…

论文阅读:Deep_Generic_Dynamic_Object_Detection_Based_on_Dynamic_Grid_Maps

目录 概要 Motivation 整体框架流程 技术细节 小结 不足 论文地址:Deep Generic Dynamic Object Detection Based on Dynamic Grid Maps | IEEE Conference Publication | IEEE Xplore 概要 该文章提出了一种基于动态网格图(Dynamic Grid Maps&a…

操作系统面试知识点总结4

#来自ウルトラマンメビウス(梦比优斯) 1 文件系统基础 1.1 文件的相关概念 文件是以计算机硬盘为载体的存储在计算机上的信息集合,可以是文本文档、图片、程序。 文件的结构:数据项、记录、文件(有结构文件、无结构式…