C# C BulkWriteAsync、事务和结果
我对mongodb的工作还比较陌生。目前,我对API,尤其是C驱动程序更加熟悉。关于批量更新,我有一些理解问题。由于C驱动程序提供了一个BulkWriteAsync方法,我可以在mongo文档中读到很多关于它的内容。据我所知,可以将BulkWrite配置为在任何步骤出现错误时不停止。这可以通过使用无序设置来完成。我没有发现的是,数据发生了什么变化。数据库是否在发生错误时进行回滚?还是我必须自己使用一个环境?如果出现错误:我可以获得哪个步骤未成功的详细信息吗?想一想批量更新100个文档。我可以找出哪些更新未成功吗?由于BulkWriteResult提供的信息很少,我不确定这个操作对我来说是否真的是一个好的操作 提前感谢你说得对,BulkWriteResult没有提供打电话决定要做什么的全部信息 但是,对于MongoBulkWriteException,您可以访问WriteErrors属性以获取出错模型的索引。下面是一个如何使用该属性的简化示例C# C BulkWriteAsync、事务和结果,c#,mongodb,C#,Mongodb,我对mongodb的工作还比较陌生。目前,我对API,尤其是C驱动程序更加熟悉。关于批量更新,我有一些理解问题。由于C驱动程序提供了一个BulkWriteAsync方法,我可以在mongo文档中读到很多关于它的内容。据我所知,可以将BulkWrite配置为在任何步骤出现错误时不停止。这可以通过使用无序设置来完成。我没有发现的是,数据发生了什么变化。数据库是否在发生错误时进行回滚?还是我必须自己使用一个环境?如果出现错误:我可以获得哪个步骤未成功的详细信息吗?想一想批量更新100个文档。我可以找出
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聚合的文档不存在依赖项。正是这种不可延迟的特性也使得交易不再需要