mongodb continueOnError不能抑制重复键错误

时间:2016-09-22 09:34:06

标签: javascript mongodb mongojs

我正在尝试使用唯一键保留一个集合。要插入的数据来自各种分布式场所(尽管单个文档是不可变的),并且可能包含重复项。我希望使用continueOnError简单地插入记录并禁止重复键错误,但仍然会抛出重复键错误。代码看起来像这样......

fetchStatuses(statusId)
  .then(results => connection
    .then(db => db.collection('statuses').ensureIndex({id: 1}, {
      unique: true, dropDups: true
    })
      .then(() => db.collection('statuses').insert(results, {continueOnError: true, safe: true}))
      .then(response => {
        winston.info(`Inserted ${response.insertedCount} statuses into mongo`);
        return results;
      })

1 个答案:

答案 0 :(得分:2)

您可能需要尝试docs中描述的无序插入:

  

以下示例执行三个文档的无序插入。   对于无序插入,如果在插入其中一个插入期间发生错误   文件中,MongoDB继续插入其余文件   数组。

db.products.insert(
   [
     { _id: 20, item: "lamp", qty: 50, type: "desk" },
     { _id: 21, item: "lamp", qty: 20, type: "floor" },
     { _id: 22, item: "bulk", qty: 100 }
   ],
   { ordered: false }
)

据我了解文档,在这种情况下不会抛出错误,而是设置了结果对象的特殊属性

  

如果insert()方法遇到非写入关注错误,则   结果包括WriteResult.writeError字段

WriteResult({
   "nInserted" : 0,
   "writeError" : {
      "code" : 11000,
      "errmsg" : "insertDocument :: caused by :: 11000 E11000 duplicate key error index: test.foo.$_id_  dup key: { : 1.0 }"
   }
})