求助:解决Mongoose创建文档时ID字段返回NaN的问题
修复Mongoose生成自增ID时出现NaN的问题
问题根源
你当前的写法有两个核心错误:
model.findOne()返回的是单个文档对象(或null),并非数组,因此不存在length属性,data.length会得到undefined,和1相加后结果就是NaN。- Mongoose的数据库操作都是异步的,直接同步调用会导致
data拿到的是Promise对象而非实际数据,同样会引发length获取失败。
解决方案
方案1:直接统计文档总数(适合低并发场景)
使用countDocuments()方法获取当前模型的总文档数,配合await等待异步操作完成:
// 统计现有文档总数 const total = await model.countDocuments(); // 创建新文档,ID设为总数+1 await model.create({ ID: total + 1 });
方案2:原子自增序列(适合高并发场景)
如果你的系统存在多用户同时创建文档的情况,直接统计总数可能出现并发冲突(多个请求拿到相同的total,导致ID重复)。此时建议用专门的自增序列模型实现原子操作:
- 先定义一个Counter模型:
const counterSchema = new mongoose.Schema({ _id: String, // 标识自增序列的名称,比如'emojiGameId' sequence_value: { type: Number, default: 0 } }); const Counter = mongoose.model('Counter', counterSchema);
- 创建新文档时,通过原子操作获取自增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
相关产品推荐
相关产品推荐

