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

5
我将使用mongoose向数据库插入大量数据。 insertMany会抛出E11000重复键错误,尽管数据已经成功保存在数据库中。
以下是我的代码:
  var data = [
      {_id: '598d7ae7c3148a6d853866e8'}, 
      {_id: '598d7afdc3148a6d853866f4'}
    ]
Movies.insertMany(data, function(error, docs) {});

这种情况很少发生。

非常感谢任何帮助。

谢谢。

4个回答

10

MongoDB不支持事务。

由于您的操作是有序的(默认情况下),MongoDB开始插入文档,直到所有文档都被写入或出现错误时停止插入(例如当一个_id已经存在于数据库中时)。如果尝试插入10个文档,在插入了5个文档后出现错误,则前5个文档将被插入,但其余文档则不会。这在此处有所记录。

同一文档还建议如何处理此问题:禁用排序,因为“使用ordered设置为false,插入操作将继续处理任何剩余的文档。”

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

3
谢谢您的回复。在提出问题之前,我已经阅读了相关信息。但是,在我的情况下,没有重复的键(_id)会导致E11000错误。我的目标集合是全新的。 - pham cuong
我已经找出了问题所在。这是Studio 3T的一个bug。我删除了集合,但刷新后它又回来了。 - pham cuong

2

我已经找到了问题所在,这是Studio 3T的一个bug。我删除了所有集合,然后导入新的集合,再刷新集合树。一些被删除的集合重新出现了。


2
我将为遇到此问题的任何人添加此处内容。我遇到了完全相同的问题,我之所以出现重复键错误是因为我的旧mongoose模型在一个键上强制实施了唯一约束条件,并且当我从mongoose模型中删除这些唯一约束条件时,我忘记完全从数据库中删除所有现有索引。当我运行:db.mycollection.getIndexes()时,我发现旧的唯一索引仍然存在于我的数据库中,即使已从每个集合中删除了所有文档。

要摆脱这些索引,我在shell中运行了:db.mycollection.dropIndexes()

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


0
你应该声明一个函数来查找和更新,并迭代数组数据。
将set和new设置为true。
  _storeLive(data) {
    shemaLive.findOneAndUpdate({
      _id: data._id
    }, data, {
      upsert: true,
      new: true
    }, (err, event) => {
      if (err) {} else {}
    });
  }


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接