Mongodb 从Mongo shell取回BulkWriteError
我想在执行Mongodb 从Mongo shell取回BulkWriteError,mongodb,mongo-shell,Mongodb,Mongo Shell,我想在执行bulk.execute()时,将writeErrors文档存储到MongoDB中的另一个集合中。我基本上是在进行批量插入/更新,但希望在批量操作的同时将所有错误捕获到另一个集合中 我可以看到Mongo Shell中返回的BulkWriteError对象,我还可以看到对象中的writeErrors数组。但我如何才能捕捉到它呢 我可以看到BulkWriteError对象在Mongo Shell中返回 它没有被退回。这是一个引发的异常。您需要一个try…catch块将其取回: > b
bulk.execute()
时,将writeErrors
文档存储到MongoDB中的另一个集合中。我基本上是在进行批量插入/更新,但希望在批量操作的同时将所有错误捕获到另一个集合中
我可以看到Mongo Shell中返回的BulkWriteError
对象,我还可以看到对象中的writeErrors
数组。但我如何才能捕捉到它呢
我可以看到BulkWriteError对象在Mongo Shell中返回
它没有被退回。这是一个引发的异常。您需要一个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
}
}
根据(第363行):
因此,您可以使用BulkWriteResult.getWriteErrors()方法
谢谢Sylvain,你的回答很有价值。我能够将writeErrors保留到我的收藏中。尽管如此,它现在保存了整个writeErrors元素!我可以看到“index”、“code”和“errmsg”已经存储,但是从getOperation()返回的作为数组的“op”并没有被持久化。关于如何持久化writeError.op[]值的任何建议。@VivekGupta持久化错误对象并不像我想象的那么容易。请参阅我的编辑,解析错误的JSON表示以允许在集合中轻松插入。是的,确实不容易!非常感谢你的帮助。我确实使用了你的参考代码来获得我想要的结果。谢谢!
// Bulk errors are basically bulk results with additional error information
BulkWriteResult.apply(this, arguments);
try {
bulk.execute();
...
} catch(err) {
if ("name" in err && err.name == 'BulkWriteError') {
var wErrors = err.getWriteErrors();
wErrors.forEach(function(doc){
db.errlog.insert(doc);
});
}
}