在插入多个值时,Mongoose错误“E11000重复键错误集合”

vom3gejh  于 2022-11-13  发布在  Go
关注(0)|答案(1)|浏览(262)

我试图将一些数据导入MongoDB,但一直遇到此错误。
MongoBulkWriteError: E11000 duplicate key error collection: MyDB.clist_list index: clients.email_1 dup key: { clients.email: null }
产品型号:

interface Client {
  name: string;
  email: string;
}

interface Agent {
  pipedrive_id: number;
  name: string;
  clients?: Array<Client>;
}

const clientSchema = new Schema<Client>({
  name: { type: String, required: true },
  email: {
    type: String,
    trim: true,
    lowercase: true,
    unique: true,
    validate: {
      validator(str: string) {
        return /^\w+([\\.-]?\w+)*@\w+([\\.-]?\w+)*(\.\w{2,3})+$/.test(str);
      },
      message: 'Please enter a valid email',
    },
    required: [true, 'Email required'],
  },  
});

const agentSchema = new Schema<Agent>({
  pipedrive_id: { type: Number, required: true },
  name: String,
  clients: [clientSchema],
});

const AgentClients = model<Agent>('client_list', agentSchema);

正如你在模型中看到的,clients集合是可选的,而且每次运行DB时,DB都会被删除并完全创建(只是为了测试,这样就不会留下索引之类的东西)。
这是有效载荷。

[
  {
    first_name: 'Jen Test',
    pipedrive_id: 2186,
    clients: []
  },
  {
    name: 'Carl Test',
    pipedrive_id: 2191,
    clients: []
  }
]

这就是我困惑的地方。当没有Clients时,email怎么会有null的重复值???
我在Model上使用insertMany方法来插入数据(如果这有帮助的话)。
我知道在这个问题上有很多类似的问题,但没有一个有我的具体问题。

huwehgph

huwehgph1#

您在clientSchema中的email属性上指定了unique: true。由于您的两个输入都没有指定email,MongoDB将假定它是null
所以你有一个冲突。在一边你指定email必须是唯一的,而在另一边你试图插入两个具有相同的nullemail的文档。
如果要保持email字段的唯一性,并在同一时间允许null值,则应检查Sparse Indexes
在架构中,应传递附加属性sparse: true

相关问题