Node.js InsertMany抛出E11000重复密钥错误,但插入成功

Node.js InsertMany抛出E11000重复密钥错误,但插入成功,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我使用mongoose将大量数据插入数据库。 insertMany抛出E11000重复键错误,尽管数据成功保存在数据库中 这是我的密码: var data = [ {_id: '598d7ae7c3148a6d853866e8'}, {_id: '598d7afdc3148a6d853866f4'} ] Movies.insertMany(data, function(error, docs) {}); 这种情况很少发生 谢谢你的帮助 谢谢MongoDB不

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

这是我的密码:

  var data = [
      {_id: '598d7ae7c3148a6d853866e8'}, 
      {_id: '598d7afdc3148a6d853866f4'}
    ]
Movies.insertMany(data, function(error, docs) {});
这种情况很少发生

谢谢你的帮助


谢谢

MongoDB不支持事务

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

因此,如果您尝试插入10个文档,但在5个文档发生错误后,将插入前5个文档,但其余的文档不会。这是有案可查的

该文档还建议了如何处理此问题:禁用排序,因为“如果
已排序
[设置]为
false
,则插入操作将继续处理所有剩余文档。”


MongoDB不支持事务

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

因此,如果您尝试插入10个文档,但在5个文档发生错误后,将插入前5个文档,但其余的文档不会。这是有案可查的

该文档还建议了如何处理此问题:禁用排序,因为“如果
已排序
[设置]为
false
,则插入操作将继续处理所有剩余文档。”


我已经解决了这个问题。这是3T工作室的一个bug。我删除所有集合,然后导入新集合,然后刷新集合树。一些丢失的收藏又回来了。

我已经解决了这个问题。这是3T工作室的一个bug。我删除所有集合,然后导入新集合,然后刷新集合树。一些删除的集合又回来了。

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

用“真”设置为“新”

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


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

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

用“真”设置为“新”

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


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

我将在这里为任何遇到这个问题的人添加这个。我也遇到了同样的问题,之所以出现这个重复键错误,是因为我的旧mongoose模型用于对我的一个键强制执行唯一约束,而当我从mongoose模型中删除这些唯一约束时,我忘记了从数据库中完全删除所有现有索引。当我运行:
db.mycollection.getIndexes()
时,我发现即使从每个集合中删除了所有文档,旧的唯一索引仍然存在于我的数据库中

为了去掉这些索引,我在shell中运行了:
db.mycollection.dropIndexes()


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

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

为了去掉这些索引,我在shell中运行了:
db.mycollection.dropIndexes()


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

谢谢您的回答。在这里创建问题之前,我已经读过了。但在我的例子中,没有可能导致错误E11000的重复密钥(_id)。我的目标系列是全新的。我已经解决了这个问题。这是3T工作室的一个bug。我放弃了收藏,但刷新后,它又回来了。谢谢你的回答。在这里创建问题之前,我已经读过了。但在我的例子中,没有可能导致错误E11000的重复密钥(_id)。我的目标系列是全新的。我已经解决了这个问题。这是3T工作室的一个bug。我放弃了收藏,但刷新后,它又回来了。