避免mongodb批量插入重复键错误

时间:2015-09-28 14:09:48

标签: javascript node.js mongodb npm bulkinsert

如何执行批量插入并在出现重复键错误时继续?

我在id字段( _id)上有一个唯一索引的集合,其中包含一些数据。然后我获得了更多数据,我想只将非现有文档添加到集合中。

我有以下代码:

let opts = {
  continueOnError: true, // Neither
  ContinueOnError: true, // of
  keepGoing: true,       // this
  KeepGoing: true,       // works
};
let bulk = collection.initializeUnorderedBulkOp( opts );
bulk.insert( d1 );
bulk.insert( d2 );
bulk.insert( d3 );
...
bulk.insert( dN );
let result = yield bulk.execute( opts ); // this keep throwing duplicate key error

只是想要忽略这些错误,并让批量完成所有排队操作。

我在npm module api和MongoDB api中搜索了BulkinitializeUnorderedBulkOp以及Bulk write的文档但没有运气。

同样在无序操作的文档中,他们say

  

错误处理

     

如果在处理其中一个写操作期间发生错误,MongoDB将继续处理列表中的剩余写操作。

这不是真的(至少在我的情况下):(

欢迎任何想法!

2 个答案:

答案 0 :(得分:5)

您可以使用db.collection.insertMany(),(版本3.2中的新增功能):

  

有序:假

如果命令为false,并且在出现重复键错误的情况下,插入操作将继续使用任何剩余文档。

以下是文档链接: https://docs.mongodb.com/v3.2/reference/method/db.collection.insertMany/

答案 1 :(得分:0)

MongoDB中的有序插入

db.hobbies.insertMany([{_id: "yoga", name: "Yoga"}, {_id: "cooking", name: "Cooking"}, {_id: "hiking", name: "Hiking"}], {ordered: true})

{ordered:true}是插入语句的默认行为

MongoDB中的无序插入

如果您希望mongodb即使在由于任何原因导致一个或多个失败后仍继续尝试插入其他文档,则必须将order设置为false。请参见下面的示例:

db.hobbies.insertMany([{_id: "yoga", name: "Yoga"}, {_id: "cooking", name: "Cooking"}, {_id: "hiking", name: "Hiking"}], {ordered: false})