InsertMany抛出E11000重复键错误但插入成功

时间:2017-08-11 10:38:37

标签: node.js mongodb mongoose

我正在使用mongoose将批量数据插入数据库。 accessToken抛出E11000重复键错误,尽管保存的数据在数据库中成功。

这是我的代码:

insertMany

这种情况很少发生。

感谢任何帮助。

谢谢

4 个答案:

答案 0 :(得分:3)

MongoDB不支持交易。

因为您的操作是有序的(默认),所以MongoDB开始插入文档,直到所有文档都被写入,或者它遇到错误(例如,当_id之一已经存在时在数据库中),此时MongoDB将停止插入其余文档。

因此,如果您尝试插入10个文档,并且在5个文档之后发生错误,则会插入前5个文档,但其余文档将不会被插入。记录在案here

同一文档还建议如何处理此问题:禁用排序,因为"使用ordered [set]到false,插入操作将继续使用任何剩余文档"

Movies.insertMany(data, { ordered : false }, function(error, docs) { ... });

答案 1 :(得分:1)

我已经弄明白了这个问题。这是Studio 3T的一个错误。我删除所有集合,然后导入新集合,然后刷新集合树。一些丢弃的收藏品又回来了。

答案 2 :(得分:0)

您应该声明一个函数以查找和更新并迭代数组数据

设置为真,并设置为真

  _storeLive(data) {
    shemaLive.findOneAndUpdate({
      _id: data._id
    }, data, {
      upsert: true,
      new: true
    }, (err, event) => {
      if (err) {} else {}
    });
  }


customArray.forEach(obj => _storeLive(obj));

答案 3 :(得分:0)

我将在这里为遇到此问题的任何人添加此内容。我有完全相同的问题,而我得到这个重复的键错误的原因是因为我的旧猫鼬模型曾经对我的一个键实施唯一约束,并且当我从猫鼬模型中删除这些唯一约束时,我忘记了完全删除数据库中所有现有索引。当我运行db.mycollection.getIndexes()时,我发现从每个集合中删除所有文档后,旧的唯一索引在我的数据库中仍然是STILL。

要摆脱这些索引,我在外壳程序中运行了db.mycollection.dropIndexes()

我为您提供的另一条提示:如果您有一个数据库种子脚本来清除您的集合并插入新数据(例如,针对您的测试套件),建议您在清除数据库后删除每个集合的所有索引。您可以像下面这样在猫鼬中删除模型的索引:myMongooseModel.collection.dropIndexes()