目录

  1. MongoDB 是否支持自增 ID?
  2. 使用自定义集合模拟自增序列
  3. 创建自增序列函数
  4. 插入文档时使用自动增长 ID
  5. 注意事项
  6. 参考资料

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 教程与使用技巧,请访问:www.52kanjuqing.com(仅出现一次)。