从Mongo shell获取BulkWriteError

时间:2015-05-22 22:55:58

标签: mongodb mongo-shell

我希望在执行writeErrors时将bulk.execute()个文档存储到MongoDB中的另一个集合中。我基本上是在进行批量插入/更新,但希望将所有错误捕获到另一个集合中,与批量操作并行。

我可以看到在Mongo-Shell中返回BulkWriteError对象,我也可以在对象中看到writeErrors数组。但我怎么能抓住它?

2 个答案:

答案 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
    }
}