我需要编写一个Azure函数,该函数使用Azure函数的第2版针对Cosmos DB数据库返回数据。但是,我很难找到关于如何做到这一点的任何好例子。我可以找到涉及搜索id的非常基本的例子。
我希望能够向azure函数发送一些要查询的字段。例如“喜欢”和“城市”在分区和分区之外。我希望它将所有记录作为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;
命名空间csharp { public static class 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;
}
}
}
`
我非常感谢任何帮助!我遇到的问题是在“尝试”部分之后。或者,如果有更好的方法,我也是开放的!
谢谢!
答案 0 :(得分:4)
将函数连接到Cosmos DB的标准方法是使用Azure Cosmos DB bindings。有关安装说明,请参阅该文章。
您还可以从中获取DocumentClient
的实例以执行自定义查询。有关使用绑定的几个示例可以在函数配方中找到: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)
该方法的实现不应该有所不同,并且它并不是真正特定于函数。
P.S。您没有提到任何具体问题,但如果您在编写正确的查询时遇到麻烦,请使用仅包含Cosmos DB代码的较小代码示例和确切的问题陈述来提出新问题。