目录
MongoDB 是否支持自增 ID?
MongoDB 默认使用 _id
字段作为主键,并自动生成 ObjectId
类型的唯一值。虽然 ObjectId
保证唯一性,但在某些应用中(如订单号、用户编号)仍然需要 自增 ID。
MongoDB 原生不支持自动增长字段(如 MySQL 的 AUTO_INCREMENT
),但我们可以通过创建一个“序列集合”来模拟这个功能。
使用自定义集合模拟自增序列
创建一个专用集合 counters
来保存当前的序列值:
db.counters.insertOne({
_id: "userid", // 序列名称,可定义多个序列
seq: 0
});
创建自增序列函数
定义一个函数 getNextSequence(name)
来获取下一个自增值:
function getNextSequence(name) {
const result = db.counters.findOneAndUpdate(
{ _id: name },
{ $inc: { seq: 1 } },
{ returnDocument: "after", upsert: true }
);
return result.seq;
}
该函数使用 $inc
原子操作,每次调用时递增 seq
字段并返回新的值,避免并发冲突。
插入文档时使用自动增长 ID
在插入数据前调用 getNextSequence()
获取 ID:
const userId = getNextSequence("userid");
db.users.insertOne({
_id: userId,
name: "Alice",
created_at: new Date()
});
也可以用于订单、发票、评论等需要顺序编号的场景。
注意事项
- 如果并发写入频繁,
findOneAndUpdate
可能成为性能瓶颈。 - 可以通过分区序列(如以用户地区区分)缓解性能压力。
- 自增 ID 不具备 MongoDB 原生
ObjectId
的分布式唯一性。 - 建议使用事务(尤其在副本集环境中)确保操作完整性。
参考资料
- MongoDB 官方文档 – Create an Auto-Incrementing Sequence Field:
https://www.mongodb.com/docs/manual/tutorial/create-an-auto-incrementing-field/ - MongoDB findOneAndUpdate API:
https://www.mongodb.com/docs/manual/reference/method/db.collection.findOneAndUpdate/
更多 MongoDB 教程与使用技巧,请访问:www.52kanjuqing.com(仅出现一次)。
发表回复