Как изменить структуру документа в CosmosDB с помощью API SQL - PullRequest
0 голосов
/ 19 марта 2020

Как изменить структуру документа или набора документов в CosmosDB при использовании SQL API?

Например, как вы должны go перейти от этого:

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

к этому:

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

Стоит отметить, что слово Часто для акта изменения структуры элементов в базе данных используется «миграция». Однако в литературе CosmosDB это слово, по-видимому, используется исключительно для акта перемещения данных в базу данных CosmosDB.

1 Ответ

1 голос
/ 19 марта 2020

Так что Cosmos DB SQL API не поддерживает частичное обновление документов. Вам потребуется replace всего документа. Что вам нужно сделать, это получить документ, внести изменения, а затем заменить элемент.

Здесь вы можете найти образец кода для этого: https://github.com/Azure/azure-cosmos-dotnet-v3/blob/master/Microsoft.Azure.Cosmos.Samples/Usage/ItemManagement/Program.cs. По той же ссылке приведен код для замены документа:

    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}");
                }
            }
        }
    }

При замене помните, что значения id и partition key не должны изменяться. Если какое-либо из значений изменится, будет создан новый документ.

...