我正在尝试使用唯一键保留一个集合。要插入的数据来自各种分布式场所(尽管单个文档是不可变的),并且可能包含重复项。我希望使用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;
})
答案 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 }"
}
})