如何使用 SQL API 更改 CosmosDB 中文档的结构

How to change the structure of a document in CosmosDB using the SQL API

如何在使用 SQL API 时更改 CosmosDB 中一个或一组文档的结构?

例如,你应该如何改变:

{
    "id": "some-id",
    "StudentId": "some@email.address",1
    // etc.

对此:

{
    "id": "some-id",
    "StudentEmail": "some@email.address",
    // etc.

值得注意的是,经常用于更改数据库中项目结构的词是 "migration"。但是,在 CosmosDB 文献中,该词似乎仅用于将数据移动到 CosmosDB 数据库的行为。

所以Cosmos DB SQL API不支持部分文档更新。您需要 replace 整个文档。您需要做的是获取文档,进行更改,然后替换项目。

您可以在此处找到相同的示例代码:https://github.com/Azure/azure-cosmos-dotnet-v3/blob/master/Microsoft.Azure.Cosmos.Samples/Usage/ItemManagement/Program.cs。来自同一个 link,这里是替换文档的代码:

    private static async Task ReplaceItemAsync(SalesOrder order)
    {
        //******************************************************************************************************************
        // 1.5 - Replace a item
        //
        // Just update a property on an existing item and issue a Replace command
        //******************************************************************************************************************
        Console.WriteLine("\n1.5 - Replacing a item using its Id");

        order.ShippedDate = DateTime.UtcNow;
        ItemResponse<SalesOrder> response = await container.ReplaceItemAsync(
            partitionKey: new PartitionKey(order.AccountNumber),
            id: order.Id,
            item: order);

        SalesOrder updated = response.Resource;
        Console.WriteLine($"Request charge of replace operation: {response.RequestCharge}");
        Console.WriteLine($"Shipped date of updated item: {updated.ShippedDate}");

        order.ShippedDate = DateTime.UtcNow;
        using (Stream stream = Program.ToStream<SalesOrder>(order))
        {
            using (ResponseMessage responseMessage = await container.ReplaceItemStreamAsync(
                partitionKey: new PartitionKey(order.AccountNumber),
                id: order.Id,
                streamPayload: stream))
            {
                // Item stream operations do not throw exceptions for better performance
                if (responseMessage.IsSuccessStatusCode)
                {
                    SalesOrder streamResponse = FromStream<SalesOrder>(responseMessage.Content);
                    Console.WriteLine($"\n1.5.2 - Item replace via stream {streamResponse.Id}");
                }
                else
                {
                    Console.WriteLine($"Replace item from stream failed. Status code: {responseMessage.StatusCode} Message: {responseMessage.ErrorMessage}");
                }
            }
        }
    }

替换时,请记住 idpartition key 值不应更改。如果任何值更改,将创建一个新文档。