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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 19:05:09