Azure Cosmos DB:使用UpsertDocumentAsync的唯一索引约束冲突



我在Azure Cosmos DB容器中为字段UniqueName定义了一个UniqueKey策略

正在计时器上调用以下函数。

我正试图使用Azure函数绑定在Azure Cosmos DB中更新文档,比如:

public async Task ManageItems([ActivityTrigger] string records,
[CosmosDB(
databaseName: "mydatabase",
collectionName: "items",
ConnectionStringSetting = "CosmosDbConnectionString")] DocumentClient client,
ILogger log)
{
var collectionUri = UriFactory.CreateDocumentCollectionUri("mydatabase", "items");


foreach (var record in records)
{
log.LogDebug($"Upserting itemNumber={record.UniqueName}");
await client.UpsertDocumentAsync(collectionUri, record);
}
}

在空白的第一次执行期间;项目";容器中,每个记录的Upsert都能出色地工作,将每个记录作为一个特定的文档插入。

然而,当对与第一次执行相同的数据进行测试时;更新";与";插入";尝试,我得到一个例外:

运行UpsertDocumentAsync方法后违反唯一索引约束

我在这里错过了什么?

据我所知,Upsert要么是更新,要么是插入,这取决于对象是否存在,通过它的唯一标识符。

该方法的传出对象唯一id是否与现有文档唯一id匹配的检查应该在Cosmos DB容器级别进行。

我期望发生的是,调用注意到具有该唯一ID的文档已经存在,并且它执行更新,而不是抛出异常。如果方法是Insertonly,我希望它会抛出异常。

这个问题是通过在类中指定一个显式"id"字段来修复的;记录";来自。

CCD_ 4被设置为唯一的"0";recordNumber";我想用它作为一种独特的价值。

为了更好地衡量,我在UpsertDocumentAsync方法中将disableAutomaticIdGeneration设置为true

UpsertDocumentAsync(collectionUri, record, disableAutomaticIdGeneration:true);

没有更多的唯一索引冲突,也没有重复。

值得注意的是,该解决方案与此类似:如何在Azure功能中的CosmosDB中插入/更新数据

最新更新