Azure Function V2 against Cosmos Db DocumentClient

Jer*_*y W 1 azure-functions azure-cosmosdb

I need to write an Azure Function that returns data against a Cosmos DB Database using Version 2 of Azure Functions. However, I am having hard time finding any good examples on how to do this. I can find very basic examples that involve search on an id.

我希望能够向天蓝色函数发送一些要查询的字段。例如分区内和分区外的“喜欢”和“城市”。我希望它以 json 文档的形式返回所有记录。

Cosmos DB Json 文档示例。

{ "id": "46465464565455566546bddgd" "Name": "Scott Smith" "City": "Scottsdale" "_pk": "56"

到目前为止我的代码

`
using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

using Microsoft.Azure.Documents;
using Microsoft.Azure.Documents.Client;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Azure.WebJobs.Host;

using Newtonsoft.Json;
Run Code Online (Sandbox Code Playgroud)

命名空间 csharp { 公共静态类 GetData {

    private static readonly string CosmosDbApiKey = Environment.GetEnvironmentVariable("CosmosDbApiKey");
    private static readonly string CosmosDbUri = Environment.GetEnvironmentVariable("CosmosDbUri");
    private static readonly DocumentClient DocumentClient = new DocumentClient(new Uri(CosmosDbUri), CosmosDbApiKey);


    [FunctionName(nameof(GetData))]
    public static async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Function, "get", Route = "api/data/getdata/{city}{likes},{_pk}")]HttpRequest req,
        string city,
        string likes,
        string _pk,
        TraceWriter log)
    {

        IActionResult result;

        try
        {

            var Options = new RequestOptions() { PartitionKey = new PartitionKey(_pk) };
            var Sql = "SELECT * FROM c" WHERE c.name={name};

            var Uri = UriFactory.CreateDocumentCollectionUri("meddb", "medcol");
            var documentUri = DocumentClient.CreateDocumentQuery(Uri, Sql, Options);
            ResourceResponse<Document> document = await DocumentClient.ReadDocumentAsync(documentUri);


            result = new OkObjectResult(
                JsonConvert.SerializeObject(document.Resource, Formatting.Indented)
            );
        }
        catch (Exception e)
        {
            log.Error(e.Message, e);
            result = new BadRequestObjectResult(e);
        }

        return result;
    }
}
}
  `
Run Code Online (Sandbox Code Playgroud)

我将非常感谢任何帮助!我遇到的问题是在“尝试”部分之后。或者如果有更好的方法,我也很乐意!

谢谢你!

Mik*_*kov 5

将 Functions 连接到 Cosmos DB 的标准方法是使用Azure Cosmos DB 绑定。请参阅该文章了解安装说明。

DocumentClient您还可以从中获取一个实例来执行自定义查询。使用绑定的几个示例可以在 Functions Recipes: Cosmos DB (DocumentDB) Bindings中找到(它们适用于 v1,所以仍然如此DocumentDB)。

您的代码将如下所示:

[FunctionName(nameof(GetData))]
public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Function, "get", Route = "api/data/getdata/{city}{likes},{_pk}")] HttpRequest req,
    [CosmosDB("test", "test", ConnectionStringSetting = "CosmosDB")] DocumentClient client, 
    string city,
    string likes,
    string _pk,
    TraceWriter log)
Run Code Online (Sandbox Code Playgroud)

该方法的实现不应该有所不同,并且它并不是真正特定于函数。

PS 您没有提到任何具体问题,但如果您在编写正确的查询时遇到困难,请使用较小的代码示例(仅包含 Cosmos DB 代码和准确的问题陈述)提出一个新问题。