Azure CosmosDB: функциональное приложение — как обновить документ

#azure #azure-cosmosdb #azure-function-app

#azure #azure-cosmosdb #azure-function-app

Вопрос:

Я новичок в Azure. Мне было интересно, могу ли я получить некоторую помощь в обновлении существующей записи с помощью триггера https.

Многие решения, которые я нахожу в Интернете, либо создают новую запись, либо обновляют полный документ. Я просто хочу обновить 2 свойства в документе.

 I tried [this][1] and the following code but it didn't work
    [FunctionName("Function1")]
    public static HttpResponseMessage Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]HttpRequestMessage req,
       [DocumentDB("MyDb", "MyCollection", ConnectionStringSetting = "MyCosmosConnectionString")] out dynamic document,
       TraceWriter log)
    {
        log.Info("C# HTTP trigger function processed a request.");
    
        dynamic data = req.Content.ReadAsAsync<object>().GetAwaiter().GetResult();
        document = data;
    
        return req.CreateResponse(HttpStatusCode.OK);
    }
  

Я хочу передать первичный ключ и 2 других значения, которые документ может обновлять на основе первичной строки. Кто-нибудь может помочь?

Комментарии:

1. Какую ошибку вы получаете, когда она не работает? Для обновления Cosmos DB требуется полный документ (а не только свойства, которые вы хотите обновить), это полная замена документа.

2. Ошибки нет, просто не обновляется. Итак, я должен сделать два вызова? один получает документ, а затем обновляет его?

3. Upsert принимает всю полезную нагрузку документа. Если документ с идентификатором и значением ключа раздела совпадает, он заменит существующий документ вашей полезной нагрузкой. Если он не существует, он создаст его.

4. @MatiasQuaranta у вас есть какой-нибудь пример, которым вы можете поделиться?

5. вы предлагаете использовать 2 функциональных приложения? 1 чтобы извлечь документ, а затем обновить его и использовать другое функциональное приложение для его обновления?

Ответ №1:

Я просто хочу обновить 2 свойства в документе.

До 2020/10/20 эта функция по-прежнему не поддерживается. Вы можете проверить скорость выполнения в этом месте:

https://feedback.azure.com/forums/263030-azure-cosmos-db/suggestions/6693091-be-able-to-do-partial-updates-on-document#{toggle_previous_statuses}

Работа по поддержке функции началась год назад и до сих пор не завершена, единственное, что мы можем сделать, это подождать.

На вашей стороне вам нужно получить документ, изменить внутренний, а затем обновить.

Простой пример:

 using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Azure.Cosmos;
using System.Collections.Generic;

namespace FunctionApp21
{
    public static class Function1
    {
        private static CosmosClient cosmosclient = new CosmosClient("AccountEndpoint=https://testbowman.documents.azure.com:443/;AccountKey=xxxxxx;");
        [FunctionName("Function1")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            CosmosContainer container = cosmosclient.GetContainer("testbowman", "testbowman");

            ItemResponse<ToDoActivity> wakefieldFamilyResponse = await container.ReadItemAsync<ToDoActivity>("testbowman", new PartitionKey("testbowman"));
            ToDoActivity itemBody = wakefieldFamilyResponse;

            itemBody.status = "This is been changed.";
            wakefieldFamilyResponse = await container.ReplaceItemAsync<ToDoActivity>(itemBody, itemBody.id, new PartitionKey(itemBody.testbowman));
            return new OkObjectResult("");
        }
    }
    public class ToDoActivity
    {
        public string id { get; set; }
        public string status { get; set; }

        public string testbowman { get; set; }
    }
}
  

Официальный документ:

https://learn.microsoft.com/en-us/azure/cosmos-db/create-sql-api-dotnet-v4#replace-an-item

Комментарии:

1. Спасибо! Я искал это весь день.

2. Пожалуйста, не создавайте CosmosClient внутри HttpTrigger. Клиенты должны быть статическими / ленивыми / вводимыми через DI: learn.microsoft.com/en-us/azure/azure-functions /…

3. @MatiasQuaranta можете ли вы поделиться примером лучшего подхода

4. @TheDeveloper Я должен сделать клиент статичным и вне триггера.