就像 Azure COSMOS SDK 的 Upsert 操作一样,我们有 PATCH + INSERT 操作吗

问题描述 投票:0回答:2

现有文件

{
    "property1" : "value1",
    "property2" : "value2",
    "property3" : "value3",
}

现在,“property2”需要更改为“newValue2”。

使用UpsertItemAsync方法,

Container.UpsertItemAsync<T>(T, Nullable<PartitionKey>, ItemRequestOptions, CancellationToken)

文档更新为

{
    "property2" : "newValue2" //"property1" & "property3" are removed.
}

我想要的是

{
    "property1" : "value1",
    "property2" : "newValue2",
    "property3" : "value3",
}

PatchItemAsync 有效

Container.PatchItemAsync<T>(String, PartitionKey, IReadOnlyList<PatchOperation>, PatchItemRequestOptions, CancellationToken)

但如果文档尚不存在,它会返回 404 NOT FOUND。

我的问题,有没有办法可以进行 PATCH + INSERT?

微软.Azure.Cosmos (3.23.0)

azure azure-cosmosdb azure-cosmosdb-sqlapi
2个回答
5
投票

至少查看docs,似乎使用 Patch 端点无法实现类似于 Upsert 的操作。 而且 Cosmos 客户端似乎也不支持类似的东西。

如果将其与创建文档操作进行比较,它会提到一个

x-ms-documentdb-is-upsert
标头,如果文档已存在,则该标头使其成为更新插入。

您可以修补文档,如果由于文档不存在而导致失败,您可以创建它。 这确实使用了控制流的异常,所以我对此不太满意:\


0
投票

这将有助于更新 cosmosdb 中的特定属性。

List<PatchOperation> patchOperations = new List<PatchOperation>()
{
    PatchOperation.Replace("/property2", "newValue2")
};

await container.PatchItemAsync<object>(id, PartitionKey, patchOperations);
© www.soinside.com 2019 - 2024. All rights reserved.