如何使用MongoDB C#驱动程序使用InsertBatch捕获成功/失败/非尝试?

时间:2014-10-21 18:43:04

标签: c# mongodb mongodb-.net-driver

InsertBatch方法返回IEnumerable<WriteConcernResult>,我认为会返回IEnumerable结果列表,每个文档传递给InsertBatch一个结果。

事实并非如此。成功后,即使我将100个文档传递给WriteConcernResult方法,它也会返回单个InsertBatch。当出现错误时,该方法抛出异常,我无法分辨哪些记录被插入,哪些插入失败,以及哪些文档未被尝试。

有没有办法可以捕获这些信息?

有两个成功插入的示例

var myObjects = new List<MyObject>();
myObjects.Add(new MyObject{Id = 1234});
myObjects.Add(new MyObject{Id = 2345});

var results = myCollection.InsertBatch(myObjects, WriteConcern.Acknowledged);

// This only returns a single object, not two
foreach (var result in results)
{
    Console.WriteLine("OK?: {0}", result.Ok);
}

示例包含2个成功插入,1个失败,1个未尝试

var myObjects = new List<MyObject>();
myObjects.Add(new MyObject{Id = 3456});    // succeeds
myObjects.Add(new MyObject{Id = 4567});    // succeeds
myObjects.Add(new MyObject{Id = 4567});    // fails
myObjects.Add(new MyObject{Id = 5678});    // unattempted

// This throws a MongoDuplicateKeyException
var results = myCollection.InsertBatch(myObjects, WriteConcern.Acknowledged);

是否可以让MongoDB C#驱动程序尝试所有插入,然后只报告失败?

1 个答案:

答案 0 :(得分:0)

如果您正在进行批量插入并且出错,那么您的程序将需要处理部分批量插入的可能性。如果您的特定用例并不关心缺少一些插入,您可以 添加continue_on_error = True参数以插入,在这种情况下插入将插入 尽可能多的文档,并报告最后一个失败的插入错误。 (Mongodb应用设计模式的一部分&#39;书&#39;)

var options = new MongoInsertOptions();
options.Flags = InsertFlags.ContinueOnError;

try
{
    myCollection.InsertBatch(myObjects, options);
}
catch (Exception ex)
{                                
}