我希望在执行writeErrors
时将bulk.execute()
个文档存储到MongoDB中的另一个集合中。我基本上是在进行批量插入/更新,但希望将所有错误捕获到另一个集合中,与批量操作并行。
我可以看到在Mongo-Shell中返回BulkWriteError
对象,我也可以在对象中看到writeErrors
数组。但我怎么能抓住它?
答案 0 :(得分:1)
根据https://github.com/mongodb/mongo/blob/master/src/mongo/shell/bulk_api.js(第363行):
// Bulk errors are basically bulk results with additional error information
BulkWriteResult.apply(this, arguments);
所以你可以使用BulkWriteResult.getWriteErrors()方法。
try {
bulk.execute();
...
} catch(err) {
if ("name" in err && err.name == 'BulkWriteError') {
var wErrors = err.getWriteErrors();
wErrors.forEach(function(doc){
db.errlog.insert(doc);
});
}
}
答案 1 :(得分:0)
我可以看到在Mongo-Shell中返回BulkWriteError对象
不是返回。这是引发的异常。您需要try...catch
块来取回它:
> bulk = db.w.initializeUnorderedBulkOp();
> bulk.insert({_id:1})
> bulk.insert({_id:1})
> try { result = bulk.execute() } catch(e) { err = e }
> err
BulkWriteError({
"writeErrors" : [
{
"index" : 1,
"code" : 11000,
"errmsg" : "E11000 duplicate key error index: test.w.$_id_ dup key: { : 1.0 }",
"op" : {
"_id" : 1
}
}
],
"writeConcernErrors" : [ ],
"nInserted" : 1,
"nUpserted" : 0,
"nMatched" : 0,
"nModified" : 0,
"nRemoved" : 0,
"upserted" : [ ]
})
令人惊讶的是,将BulkWriteError
存储在集合中是相当痛苦的。一种简单的方法(不一定是一种优雅的方式)是解析错误的JSON表示以获取您感兴趣的字段。
> db.errlog.insert(JSON.parse(err.tojson()).writeErrors)
// ^^^^^^^^^^^^^^^^^^^^^^^^
// parse the JSON representation of `BulkWriteError`
这样,你就会找回写错误数组,insert
将很乐意存储在集合中:
> db.errlog.find().pretty()
{
"_id" : ObjectId("55619737c0c8238aef6e21c5"),
"index" : 0,
"code" : 11000,
"errmsg" : "E11000 duplicate key error index: test.w.$_id_ dup key: { : 1.0 }",
"op" : {
"_id" : 1
}
}