修补 CosmosDB 中子文档的单个属性

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

我正在尝试对 CosmosDb 中的子文档进行部分更新。我的对象模型是这样的:

public class PhoneBookCategory
{
    public string Id { get; set; }

    public string Name { get; set; }

    public TestObject SubProp { get; set; }
}

public class TestObject
{
    public string StringProp { get; set; }

    public int? IntProp { get; set; }
}

假设我想更新 Name 属性和 SubProp,我会这样做

List<PatchOperation> updates = [];
updates.Add(PatchOperation.Add($"/Name", "new name"));
updates.Add(PatchOperation.Add($"/SubProp", new TestObject { StringProp = "hello"}));
database.GetContainer("collectionName").PatchItemAsync<PhoneBookCategory>(item.Id, new PartitionKey(item.Id), patchOperations)

这个效果很好。现在假设我只想修改

SubProp.StringProp
。所以,我的第二个 PatchOperation 将变成

updates.Add(PatchOperation.Add($"/SubProp/StringProp", "hello"));

但这只是错误请求,并且没有有用的错误消息(原因是 ())。

我想‘也许,它需要替换 subprop,因为在这种情况下我们知道 SubProp 存在,并且我们只想更改 SubProp 文档上的值,所以我尝试了这个:

updates.Add(PatchOperation.Replace($"/SubProp/StringProp", "hello"));

仍然没有骰子。

那么我做错了什么?根据概述,允许子文档更新。

请注意,我正在使用

CosmosClientOptions.SerializerOptions.PropertyNamingPolicy = CosmosPropertyNamingPolicy.CamelCase
(以防有人想知道为什么我使用 CamelCase 编写补丁操作。

c# asp.net-core azure-cosmosdb patch
1个回答
0
投票

下面是我测试过的工作示例,如果仍有错误,可以显示详细错误。

using Microsoft.Azure.Cosmos;
using Newtonsoft.Json;
internal class Program
{
    private static async Task Main(string[] args)
    {
        var endpoint = "xxx";
        var key = "xxx";
        var itemId = "a835a3c9-fa0a-42f8-b7c6-8d0e93a2e96b";
        try
        {
            var cosmosClient = new CosmosClient(endpoint,key);
            var database = cosmosClient.GetDatabase("MyDatabase");
            var container = database.GetContainer("MyContainer");

            var patchOperations = new[]
            {
                PatchOperation.Replace("/SubProp/StringProp", "hello")
            };

            ItemResponse<PhoneBookCategory> itemResponse = await container.PatchItemAsync<PhoneBookCategory>(itemId, new PartitionKey(itemId), patchOperations);
            Console.WriteLine($"Item modified with id {itemResponse.Resource.Id}");
        }
        catch (CosmosException ex)
        {
            Console.WriteLine($"Cosmos DB Exception with Status {ex.StatusCode} Message: {ex.Message}");
        }
    }
}

public class PhoneBookCategory
{
    [JsonProperty(PropertyName = "id")]
    public string Id { get; set; }
    public string Name { get; set; }
    public TestObject SubProp { get; set; }
}
public class TestObject
{
    public string StringProp { get; set; }
    public int? IntProp { get; set; }
}
© www.soinside.com 2019 - 2024. All rights reserved.