CosmosDB-Mongodb IsUpsert无法用于批量更新

问题描述

最近几个月,我们通过.NET Core和最新的MongoDB.Driver Nuget软件包(2.11.0)在MonsDB和CosmosDB(Server v3.6)中广泛使用了MongoDB API。

批量插入和插入工作正常,但是很遗憾,我无法使批量操作与IsUpsert=true模式一起使用。

注意:

  • 我们使用Polly来管理速率限制。在此过程中,我们处理MongoWriteException,MongoExecutionTimeoutException,MongoCommandExceptionMongoBulkWriteExceptions
  • 分片/非分片集合都可以观察到此问题。

具体来说,给定非分片输入文档List<T> documents的列表,以下方法可以正常工作:

  1. 批量插入:

    await Collection.BulkWriteAsync(documents.Select(s => new InsertOneModel<T>(s)),...)
    
  2. 批量更新:

    await Collection.BulkWriteAsync(documents.Select(s =>
      new ReplaceOneModel<T>(Builders<T>.Filter.Eq("Id",item.Id),item) { IsUpsert = false }),...)
    

不幸的是,如果某些文档是新文档,我们应该能够按原样使用上面的批量更新代码-只需将IsUpsert标志设置为true ...但是,这是行不通的。

具体来说,提供了50个现有文档和50个新文档

  • 如果文档的ID类型为ObjectId作为主键,则对于它处理的第一个新文档,CosmosDb将错误地使用Id=ObjectId("000000000000000000000000")插入它-届时将不再插入/更新其他文档。在这种情况下:
    • BulkWriteResult返回了MatchedCount=65,ModifiedCount=65,ProcessedRequests=100,RequestCount=100,Upserts=1,IsAcknowledged=true,IsModifiedCountAvailable=true,InsertedCount=0
    • 没有引发异常。
    • 注意-数据库中只有51个文档,因此不能依赖BulkWriteResult
  • 如果文档的ID类型为int作为主键,那么cosmos db似乎可以
    • 在某些随机点放弃处理文档。这似乎是一种限制速率的方案... 除了不会引发异常
    • 例如,更新所有50个文档,但仅插入8个。在这种情况下,BulkWriteResult返回MatchedCount=50,ModifiedCount=50,Upserts=8,InsertedCount=0

我想念什么? ObjectId场景似乎完全崩溃了;其他情况下可能会被编码,但是这里没有引发异常似乎并不正确。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)