You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:解决Mongoose创建文档时ID字段返回NaN的问题

修复Mongoose生成自增ID时出现NaN的问题

问题根源

你当前的写法有两个核心错误:

  1. model.findOne()返回的是单个文档对象(或null),并非数组,因此不存在length属性,data.length会得到undefined,和1相加后结果就是NaN。
  2. Mongoose的数据库操作都是异步的,直接同步调用会导致data拿到的是Promise对象而非实际数据,同样会引发length获取失败。

解决方案

方案1:直接统计文档总数(适合低并发场景)

使用countDocuments()方法获取当前模型的总文档数,配合await等待异步操作完成:

// 统计现有文档总数
const total = await model.countDocuments();
// 创建新文档,ID设为总数+1
await model.create({ ID: total + 1 });

方案2:原子自增序列(适合高并发场景)

如果你的系统存在多用户同时创建文档的情况,直接统计总数可能出现并发冲突(多个请求拿到相同的total,导致ID重复)。此时建议用专门的自增序列模型实现原子操作:

  1. 先定义一个Counter模型:
const counterSchema = new mongoose.Schema({
  _id: String, // 标识自增序列的名称,比如'emojiGameId'
  sequence_value: { type: Number, default: 0 }
});
const Counter = mongoose.model('Counter', counterSchema);
  1. 创建新文档时,通过原子操作获取自增ID:
// 原子递增序列值,不存在则创建该序列文档
const counter = await Counter.findOneAndUpdate(
  { _id: 'emojiGameId' },
  { $inc: { sequence_value: 1 } },
  { new: true, upsert: true }
);
// 用递增后的序列值作为新文档的ID
await model.create({ ID: counter.sequence_value });

内容的提问来源于stack exchange,提问作者GAMING Fynn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 13:21:06