我该如何执行批量插入并在出现重复键错误时继续进行?
我有一个带有唯一索引的集合,索引是在
我有以下代码:
我只想忽略错误,让批量操作完成所有排队的操作。
我在npm模块API和MongoDB API中搜索Bulk, initializeUnorderedBulkOp以及Bulk write的文档,但没有找到。
我有一个带有唯一索引的集合,索引是在
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模块API和MongoDB API中搜索Bulk, initializeUnorderedBulkOp以及Bulk write的文档,但没有找到。
在无序操作文档中,他们说:
错误处理
如果在处理其中一个写操作时发生错误,MongoDB将继续处理列表中剩余的写操作。
这是不正确的(至少在我的情况下)。
UnOrderdedBukOp
结构永远不会产生“抛出”错误,而只会在响应中产生“错误列表”。不是第一个对此抱怨的人。一般的建议是“忽略”错误并自己检查结果对象,因为结果将始终继续到批处理的末尾。所以你的说法是不正确的,因为它实际上确实写入了列表中的所有操作(有效的操作),但它只是在我认为不应该抛出一个错误。 - Blakes Sevenexecute
方法会引发异常,并且承诺只会被拒绝并失去BulkWriteResult
对象。 - Voloxbulk.find().upsert().replaceOne()
来代替insert。这样,如果找到了具有该id
的文档,则将其替换为新文档,否则将创建一个新文档。没有重复键错误,状态一致。 - Markus W Mahlberg