【问题标题】:Azure CosmosDB: function app- how to update a documentAzure CosmosDB:函数应用 - 如何更新文档
【发布时间】:2020-10-19 20:36:39
【问题描述】:

我是 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 个其他值。有人可以帮忙吗?

【问题讨论】:

  • 当它不起作用时你得到什么错误? Cosmos DB Upsert 需要完整的文档(不仅仅是要更新的属性),它是完整的文档替换。
  • 没有错误,只是没有更新。那我应该打两个电话吗?一个获取文档然后更新它?
  • Upsert 获取完整的文档有效负载。如果具有 id 和 Partition Key 值的文档匹配,它将用您的有效负载替换现有文档。如果它不存在,它将创建它。
  • @MatiasQuaranta 你有什么可以分享的例子吗?
  • 您是否建议使用 2 个功能应用程序? 1 拉取文档然后更新它并使用另一个功能应用来更新它?

标签: azure azure-cosmosdb azure-function-app


【解决方案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://docs.microsoft.com/en-us/azure/cosmos-db/create-sql-api-dotnet-v4#replace-an-item

【讨论】:

  • 谢谢!我整天都在找这个。
  • 请不要在 HttpTrigger 中创建 CosmosClient。客户端应该是静态的/惰性的/通过 DI 注入的:docs.microsoft.com/en-us/azure/azure-functions/…
  • @MatiasQuaranta 你能分享一个更好方法的例子吗
  • @TheDeveloper 我已将客户端设为静态且位于触发器之外。
猜你喜欢
  • 1970-01-01
  • 2018-10-09
  • 1970-01-01
  • 2018-09-29
  • 2022-10-07
  • 1970-01-01
  • 2019-11-01
  • 1970-01-01
  • 2019-11-01
相关资源
最近更新 更多