为啥插入子文档数组时出现“重复键错误”?

Posted

技术标签:

【中文标题】为啥插入子文档数组时出现“重复键错误”?【英文标题】:Why "duplicate key error" when inserting subdocument arrays?为什么插入子文档数组时出现“重复键错误”? 【发布时间】:2019-12-12 06:55:41 【问题描述】:

我有一个使用子文档的 Mongoose 架构。它们的定义是:

const vraagSchema = new mongoose.Schema(
  vraagNummer: 
    type: Number,
    required: true,
    min: 1
  ,
  vraagTekst: 
    type: String,
    minLength: 1,
    required: true
  ,
  waarde: 
    type: Number,
    required: true,
    min: 1
  
,  collection: 'vragen' );

const checkSchema = new mongoose.Schema(
  checkID: 
    type: String,
    required: true,
    min: 2
  ,
  sessieNummer: 
    type: Number,
    required: true,
    min: 1
  ,
  omschrijving: 
    type: String,
    required: true
  ,
  vragen: 
    type: [vraagSchema]
  ,
  logData: 
    type: String,
    required: false,
    default: ''
  
);
checkSchema.index( sessieNummer: 1, checkID: 1 ,  unique: true )

现在,当我为“vragen”字段插入 1 个带有空数组的检查项目(“vragen”是荷兰语的“问题”)时,没有问题。 但是,当我尝试插入另一个 Check 项时,字段值略有不同(因此它是唯一的),而且还有一个空数组“[]”作为“vragen”的值,我收到一个错误:“MongoError:E11000 重复关键错误集合:demastermind_test.checks 索引:vragen.vraagNummer_1 dup key::null”。

为什么空数组会导致重复键错误?我该如何防止这种情况发生?

然后我检查了如果我插入带有非空数组的 Check 项会发生什么。所以我插入了两个具有不同字段值的检查(因此它们是唯一的),其中 1 个项目有一个“vragen”数组,其中包含“vraag”项目,1 个项目有一个“vragen”数组,其中有两个“vraag”项目他们(我确保这两个项目有不同的“vraagNummer”waardes)。 这也会导致完全相同的重复键错误。

我错过了什么?

【问题讨论】:

【参考方案1】:

我已经解决了这个问题。显然,当我开始处理这个问题时,我使用了不正确的架构定义(或其他东西),并且该错误在 de Collection 中“卡住”了。

我通过删除整个集合解决了这个问题(它目前是一个测试集合,所以这不是问题),现在它可以正常工作了。

【讨论】:

以上是关于为啥插入子文档数组时出现“重复键错误”?的主要内容,如果未能解决你的问题,请参考以下文章

Codeigniter:当我插入数据时出现重复键错误,我该如何处理这个错误?

插入期间:E11000 重复键错误索引

MongoDB插入引发重复键错误

使用空数组添加新用户记录时出现“E11000 重复键错误收集”

EF 更新大量的数据时出现重复键错误

创建记录时出现重复键错误