2016-09-22 54 views
0

我正在尝试保留一个具有唯一键的集合。要插入的数据来自各种分布式位置(尽管单个文档是不可变的),并且可能包含重复项。我希望只需插入记录并使用continueOnError来抑制重复的键错误,但重复的键错误仍然存​​在。该代码看起来像这样...mongodb 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

您可能希望像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 }" 
    } 
})