Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C BulkWriteAsync、事务和结果_C#_Mongodb - Fatal编程技术网

C# C BulkWriteAsync、事务和结果

C# C BulkWriteAsync、事务和结果,c#,mongodb,C#,Mongodb,我对mongodb的工作还比较陌生。目前,我对API,尤其是C驱动程序更加熟悉。关于批量更新,我有一些理解问题。由于C驱动程序提供了一个BulkWriteAsync方法,我可以在mongo文档中读到很多关于它的内容。据我所知,可以将BulkWrite配置为在任何步骤出现错误时不停止。这可以通过使用无序设置来完成。我没有发现的是,数据发生了什么变化。数据库是否在发生错误时进行回滚?还是我必须自己使用一个环境?如果出现错误:我可以获得哪个步骤未成功的详细信息吗?想一想批量更新100个文档。我可以找出

我对mongodb的工作还比较陌生。目前,我对API,尤其是C驱动程序更加熟悉。关于批量更新,我有一些理解问题。由于C驱动程序提供了一个BulkWriteAsync方法,我可以在mongo文档中读到很多关于它的内容。据我所知,可以将BulkWrite配置为在任何步骤出现错误时不停止。这可以通过使用无序设置来完成。我没有发现的是,数据发生了什么变化。数据库是否在发生错误时进行回滚?还是我必须自己使用一个环境?如果出现错误:我可以获得哪个步骤未成功的详细信息吗?想一想批量更新100个文档。我可以找出哪些更新未成功吗?由于BulkWriteResult提供的信息很少,我不确定这个操作对我来说是否真的是一个好的操作

提前感谢

你说得对,BulkWriteResult没有提供打电话决定要做什么的全部信息

但是,对于MongoBulkWriteException,您可以访问WriteErrors属性以获取出错模型的索引。下面是一个如何使用该属性的简化示例

var models = sourceOfModels.ToArray();
for (var i = 0; i < MaxTries; i++)
    try
    {
        return await someCollection.BulkWriteAsync(models, new BulkWriteOptions { IsOrdered = false });
    }
    catch (MongoBulkWriteException e)
    {
        // reconstitute the list of models to try from the set of failed models
        models = e.WriteErrors.Select(x => models[x.Index]).ToArray();
    }
注意:上面的代码非常幼稚。我的实际代码更复杂。上面所做的是反复尝试写,在每种情况下,只写未完成的内容。假设你开始写1000个ReplaceOne模型,900个通过;第二次尝试将对剩余的100次进行尝试,依此类推,直到重试次数用尽,或者没有错误为止

如果代码不在事务中,并且发生错误,那么当然不会回滚任何内容;你有成功的作品,也有失败的作品。对于事务,MongoDB 4.2+。在此之前,您不会得到异常

最后,虽然默认为有序写入,但当写入彼此无关时,无序写入非常有用,例如,表示DDD聚合的文档不存在依赖项。正是这种不可延迟的特性也使得交易不再需要