问题描述
最近几个月,我们通过.NET Core和最新的MongoDB.Driver Nuget软件包(2.11.0)在MonsDB和CosmosDB(Server v3.6)中广泛使用了MongoDB API。
批量插入和插入工作正常,但是很遗憾,我无法使批量操作与IsUpsert=true
模式一起使用。
注意:
- 我们使用
Polly
来管理速率限制。在此过程中,我们处理MongoWriteException,MongoExecutionTimeoutException,MongoCommandException
和MongoBulkWriteExceptions
。- 分片/非分片集合都可以观察到此问题。
具体来说,给定非分片输入文档List<T> documents
的列表,以下方法可以正常工作:
-
批量插入:
await Collection.BulkWriteAsync(documents.Select(s => new InsertOneModel<T>(s)),...)
-
批量更新:
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 (将#修改为@)