MongoDB设置主键自增

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
云数据库 MongoDB,通用型 2核4GB
简介: 【5月更文挑战第10天】

MongoDB设置主键自增

在MongoDB中,通常情况下,我们并不像关系型数据库那样使用自增主键。MongoDB默认使用ObjectId来作为文档的主键,它是一个12字节的唯一标识符,包含时间戳、机器ID、进程ID和随机数。但是,有时候我们确实需要使用自增主键来满足一些特定需求,比如在某些场景下需要直观的连续数字作为主键。 下面介绍如何在MongoDB中设置自增主键:

使用计数器集合

一种常见的方法是使用一个专门的集合来存储计数器,每次需要新的自增ID时,先从计数器集合获取下一个ID,然后将其用作主键。这种方法的好处是简单易懂,并且可以在分布式环境中很好地工作。 首先,我们需要创建一个计数器集合,用来存储各个文档类型的自增ID:

javascriptCopy code
db.createCollection("counters")

然后,我们需要初始化计数器集合,为每个文档类型创建一个初始计数器:

javascriptCopy code
db.counters.insertOne({ _id: "product_id", sequence_value: 0 })

接下来,我们可以编写一个函数来获取下一个自增ID:

javascriptCopy code
function getNextSequenceValue(sequenceName) {
   var sequenceDocument = db.counters.findAndModify({
      query:{_id: sequenceName },
      update: {$inc:{sequence_value:1}},
      new:true
   });
   return sequenceDocument.sequence_value;
}

最后,我们可以在需要使用自增ID的地方调用该函数来获取下一个ID:

javascriptCopy code
var nextId = getNextSequenceValue("product_id");

使用自定义主键值

另一种方法是使用自定义主键值,通过应用逻辑来生成唯一的主键值。这种方法的好处是不需要维护额外的计数器集合,但是需要确保生成的主键值在整个集合中是唯一的。 我们可以在插入文档时,手动指定主键值:

javascriptCopy code
db.products.insertOne({
   _id: 1, // 手动指定主键值
   name: "Product 1",
   price: 100
})

或者,我们可以在应用逻辑中生成唯一的主键值,然后插入文档:

javascriptCopy code
var nextId = generateUniqueId(); // 生成唯一的主键值
db.products.insertOne({
   _id: nextId,
   name: "Product 2",
   price: 200
})

一个电商平台,我们希望每个商品都有一个唯一的自增商品ID作为主键,方便进行商品的管理和查询。

使用计数器集合

首先,创建一个计数器集合用于存储商品ID的自增值:

javascriptCopy code
db.createCollection("counters")
db.counters.insertOne({ _id: "product_id", sequence_value: 0 })

然后,编写一个函数来获取下一个自增ID:

javascriptCopy code
function getNextProductID() {
   var sequenceDocument = db.counters.findAndModify({
      query:{_id: "product_id" },
      update: {$inc:{sequence_value:1}},
      new:true
   });
   return sequenceDocument.sequence_value;
}

接下来,我们可以在插入商品文档时,自动获取下一个自增ID作为主键:

javascriptCopy code
var productId = getNextProductID();
db.products.insertOne({
   _id: productId,
   name: "Product 1",
   price: 100
})

使用自定义主键值

另一种方法是通过应用逻辑来生成唯一的主键值。例如,我们可以在插入商品文档之前,生成一个唯一的商品ID作为主键:

javascriptCopy code
function generateUniqueProductID() {
   // 在这里编写生成唯一ID的逻辑,可以使用UUID或其他算法
   var uniqueId = ...;
   return uniqueId;
}
var productId = generateUniqueProductID();
db.products.insertOne({
   _id: productId,
   name: "Product 2",
   price: 200
})

在这个示例中,我们可以根据实际需求选择适合的生成唯一ID的算法,比如使用UUID库或其他生成唯一ID的方法。 总结起来,通过使用计数器集合或自定义主键值,我们可以在MongoDB中实现自增主键。具体选择哪种方法取决于业务需求和数据模型设计。


MongoDB的ObjectId是一种默认的主键类型,用于唯一标识MongoDB中的文档。它是一个12字节的值,由以下部分组成:

  1. 时间戳(4字节):表示ObjectId的创建时间,以秒为单位,精确到秒级别。
  2. 机器ID(3字节):表示生成ObjectId的机器的标识符,通常是机器的MAC地址的低三个字节。
  3. 进程ID(2字节):表示生成ObjectId的进程的标识符。
  4. 随机数(3字节):表示ObjectId的随机数部分,用于保证ObjectId的唯一性。 由于ObjectId的时间戳部分包含了生成ObjectId的时间信息,因此ObjectId默认是按照时间有序的。这样的设计可以在一定程度上提高查询性能,因为新创建的文档将会被写入磁盘的相邻位置,减少磁盘寻道的时间。 ObjectId有以下特点:
  • 全局唯一性:几乎可以保证不同文档的ObjectId是唯一的。
  • 顺序性:默认情况下,ObjectId是根据时间递增的,可以用于按照时间排序的场景。
  • 低碰撞概率:由于ObjectId使用了随机数部分,因此碰撞的概率非常低,可以满足绝大多数应用场景的需求。 ObjectId的使用示例:
javascriptCopy code
// 创建文档并自动生成ObjectId作为主键
db.products.insertOne({
   _id: ObjectId(),
   name: "Product 1",
   price: 100
})
// 查询文档
db.products.find({ _id: ObjectId("606e04a1768e60888aa6d238") })
// 使用ObjectId进行排序
db.products.find().sort({ _id: 1 })

需要注意的是,虽然ObjectId在大多数情况下能满足需求,但在某些特定场景下可能需要使用自定义的主键类型,比如需要使用自增ID时,可以采用计数器集合或自定义主键值的方式来实现。

结论

在MongoDB中设置自增主键可以通过使用计数器集合或者自定义主键值来实现。选择哪种方法取决于具体的需求和应用场景,但是需要注意确保生成的主键值在整个集合中是唯一的。

相关实践学习
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
2月前
|
NoSQL Linux atlas
|
2月前
|
存储 NoSQL Unix
.NET生成MongoDB中的主键ObjectId
.NET生成MongoDB中的主键ObjectId
.NET生成MongoDB中的主键ObjectId
|
SQL 存储 NoSQL
MongoDB:21-MongoDB-自增Id
MongoDB:21-MongoDB-自增Id
613 0
MongoDB:21-MongoDB-自增Id
|
2月前
|
NoSQL MongoDB 数据库
MongoDB【部署 03】Windows系统安装mongodb并设置用户名密码(无需安装mongosh)及SpringBoot集成报错 Command failed with error 18
MongoDB【部署 03】Windows系统安装mongodb并设置用户名密码(无需安装mongosh)及SpringBoot集成报错 Command failed with error 18
216 0
|
NoSQL 安全 MongoDB
mongodb设置用户账号密码登录
今天有个同事的项目中mongodb 被黑客攻占了,然后数据库被清掉,留下了一堆“案发现场”,还整了一个段话,附上给大家伙瞧瞧。。。。
2731 1
mongodb设置用户账号密码登录
|
12月前
|
NoSQL MongoDB 数据库
mongodb使用使用 SCRAM 验证客户端设置访问控制
SCRAM 验证客户端设置访问控制
85 0
|
NoSQL MongoDB 数据库
分布式服务器框架之Server.Core库中实现YFUniqueEntity、YFUniqueIDBase 管理MongoDB 自定义Id的自增
YFUniqueEntity是数据库中的结构,GetUniqueID函数中会根据Type和自增步长去数据库中寻找该类型的当前ID是多少,然后会用当前的Id去加上步长,把更新后的新ID插入到MongoDB中记录着ID的那张表里。
|
NoSQL Java MongoDB
Springboot中设置MongoDB的超时时间
Springboot中设置MongoDB的超时时间
2170 0
|
NoSQL 关系型数据库 MySQL
全栈开发【第3期】MongoDB入门之数据库权限设置
全栈开发【第3期】MongoDB入门之数据库权限设置
399 0
|
NoSQL MongoDB 数据库
MongoDB设置为Windows服务
MongoDB设置为Windows服务
245 0
MongoDB设置为Windows服务