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);
        });
    }
}