Mongoose创建文档时重复生成同一_id触发E11000错误
Mongoose创建Purchase文档时重复生成相同_id的问题
问题背景
使用Mongoose创建Purchase文档时,每次都会生成完全相同的_id: ObjectId('6605b8d3570e447569d56dde'),导致MongoDB抛出重复键错误。该问题仅出现在这个PurchaseSchema上,且Schema中未手动定义_id字段。
PurchaseSchema代码
const PurchaseSchema = new mongoose.Schema({ amount: { type: String, required: true }, firstName: { type: String, required: true }, lastName: { type: String, required: true }, email: { type: String, required: true }, company: { type: String, required: true }, poBox: { type: String }, billingAddress: { type: String, required: true }, billingCity: { type: String, required: true }, billingState: { type: String, required: true }, billingZipCode: { type: String }, shippingAddress: { type: String, required: true }, shippingCity: { type: String, required: true }, shippingState: { type: String, required: true }, shippingZipCode: { type: String }, shippingZipcode: { type: String }, repPhone: { type: String }, repEmail: { type: String }, attn: { type: String }, tier: { type: String, required: true }, officeId: { type: String, required: true }, cart: { type: Object, required: true }, extraDetails: { type: String }, agreement: { type: Boolean, required: true }, accountNumber: { type: String }, date: { type: Date, default: () => Date().now, immutable: true }, });
错误信息
MongoServerError: E11000 duplicate key error collection: **REDACTED** index: _id_ dup key: { _id: ObjectId('6605b8d3570e447569d56dde') } **REDACTED** { index: 0, code: 11000, keyPattern: { _id: 1 }, keyValue: { _id: new ObjectId('6605b8d3570e447569d56dde') }, [Symbol(errorLabels)]: Set(0) {} }
创建文档的代码
const Purchase = new Suneva_Purchase({ ...userDetails, ...companyDetails, amount: price, cart: cart, repEmail: repEmail, repPhone: repPhone, tier: tier, officeId: officeId, shippingZipCode: userDetails.shippingZipcode, }); console.log(Purchase); const savedPurchase = await Purchase.save();
控制台日志
{ ...correct information, _id: new ObjectId('6605b8d3570e447569d56dde'), __v: 0 }
问题排查与解决步骤
修正
date字段默认值写法
Schema中date字段的默认值存在错误:Date().now是无效写法(Date()返回字符串,不存在now属性),这会干扰Mongoose内部逻辑,导致_id生成异常。修正为:date: { type: Date, default: Date.now, immutable: true },或显式函数写法:
date: { type: Date, default: () => Date.now(), immutable: true },检查Model是否重复定义
确认Suneva_Purchase模型未被重复定义(比如多次调用mongoose.model('Suneva_Purchase', PurchaseSchema)),重复定义会导致Mongoose内部状态紊乱。确保模型只初始化一次,或通过mongoose.model('Suneva_Purchase')获取已存在的模型。手动指定
_id生成逻辑(临时方案)
若上述方法无效,可在Schema中手动声明_id字段,强制生成新的ObjectId:const { ObjectId } = mongoose.Types; const PurchaseSchema = new mongoose.Schema({ _id: { type: ObjectId, default: () => new ObjectId() }, // 其他字段保持不变 });重启服务清除缓存
Node.js的模块缓存可能导致旧版Schema/Model被复用,重启服务可清除缓存,确保使用修正后的代码。
内容的提问来源于stack exchange,提问作者Keaton Benning
相关产品推荐
相关产品推荐

