【发布时间】:2020-11-30 17:12:14
【问题描述】:
过去几个月,我们通过 .NET Core 和最新的 MongoDB.Driver Nuget 包 (2.11.0) 广泛使用 MongoDB API 和 CosmosDB (Server v3.6)。
批量插入和插入工作正常,但不幸的是,我无法使用 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, ProcessedRequests=100, RequestCount=100, Upserts=8, IsAcknowledged=true, IsModifiedCountAvailable=true, InsertedCount=0。
我错过了什么? ObjectId 场景似乎完全崩溃了;其他场景可以编码,但这里没有引发异常似乎不正确。
【问题讨论】:
标签: mongodb azure azure-cosmosdb