Azure Cosmos DB invoerbinding voor Azure Functions 2.x en hoger

Bij een Azure Cosmos DB-invoerbinding wordt de SQL-API gebruikt voor het ophalen van een of meer Azure Cosmos DB-documenten en het doorgeven daarvan aan de invoerparameter van de functie. De document-id of queryparameters kunnen worden bepaald op basis van de trigger waarmee de functie wordt geactiveerd.

Zie het overzicht voor meer informatie over de installatie- en configuratiegegevens.

Notitie

Als de verzameling is gepart partitioneerd,moeten opzoekbewerkingen ook de waarde van de partitiesleutel opgeven.

Deze sectie bevat de volgende voorbeelden:

De voorbeelden verwijzen naar een eenvoudig ToDoItem type:

namespace CosmosDBSamplesV2
{
    public class ToDoItem
    {
        [JsonProperty("id")]
        public string Id { get; set; }

        [JsonProperty("partitionKey")]
        public string PartitionKey { get; set; }

        public string Description { get; set; }
    }
}

Wachtrijtrigger, id op zoek vanuit JSON

In het volgende voorbeeld ziet u een C#-functie die één document op haalt. De functie wordt geactiveerd door een wachtrijbericht dat een JSON-object bevat. De wachtrijtrigger parseert de JSON in een object van het type , dat de id en partitiesleutelwaarde bevat om ToDoItemLookup op te zoeken. Deze id en partitiesleutelwaarde worden gebruikt om een ToDoItem document op te halen uit de opgegeven database en verzameling.

namespace CosmosDBSamplesV2
{
    public class ToDoItemLookup
    {
        public string ToDoItemId { get; set; }

        public string ToDoItemPartitionKeyValue { get; set; }
    }
}
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;

namespace CosmosDBSamplesV2
{
    public static class DocByIdFromJSON
    {
        [FunctionName("DocByIdFromJSON")]
        public static void Run(
            [QueueTrigger("todoqueueforlookup")] ToDoItemLookup toDoItemLookup,
            [CosmosDB(
                databaseName: "ToDoItems",
                collectionName: "Items",
                ConnectionStringSetting = "CosmosDBConnection",
                Id = "{ToDoItemId}",
                PartitionKey = "{ToDoItemPartitionKeyValue}")]ToDoItem toDoItem,
            ILogger log)
        {
            log.LogInformation($"C# Queue trigger function processed Id={toDoItemLookup?.ToDoItemId} Key={toDoItemLookup?.ToDoItemPartitionKeyValue}");

            if (toDoItem == null)
            {
                log.LogInformation($"ToDo item not found");
            }
            else
            {
                log.LogInformation($"Found ToDo item, Description={toDoItem.Description}");
            }
        }
    }
}

HTTP-trigger, id opvragen uit queryreeks

In het volgende voorbeeld ziet u een C#-functie die één document op haalt. De functie wordt geactiveerd door een HTTP-aanvraag die gebruikmaakt van een queryreeks om de id en partitiesleutelwaarde op te zoeken. Deze id en partitiesleutelwaarde worden gebruikt om een ToDoItem document op te halen uit de opgegeven database en verzameling.

Notitie

De http-queryreeksparameter is casegevoelig.

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;

namespace CosmosDBSamplesV2
{
    public static class DocByIdFromQueryString
    {
        [FunctionName("DocByIdFromQueryString")]
        public static IActionResult Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]
                HttpRequest req,
            [CosmosDB(
                databaseName: "ToDoItems",
                collectionName: "Items",
                ConnectionStringSetting = "CosmosDBConnection",
                Id = "{Query.id}",
                PartitionKey = "{Query.partitionKey}")] ToDoItem toDoItem,
            ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");

            if (toDoItem == null)
            {
                log.LogInformation($"ToDo item not found");
            }
            else
            {
                log.LogInformation($"Found ToDo item, Description={toDoItem.Description}");
            }
            return new OkResult();
        }
    }
}

HTTP-trigger, id op zoeken uit routegegevens

In het volgende voorbeeld ziet u een C#-functie die één document op haalt. De functie wordt geactiveerd door een HTTP-aanvraag die gebruikmaakt van routegegevens om de id en partitiesleutelwaarde op te geven die moeten worden opgevraagd. Deze id en partitiesleutelwaarde worden gebruikt om een ToDoItem document op te halen uit de opgegeven database en verzameling.

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;

namespace CosmosDBSamplesV2
{
    public static class DocByIdFromRouteData
    {
        [FunctionName("DocByIdFromRouteData")]
        public static IActionResult Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post",
                Route = "todoitems/{partitionKey}/{id}")]HttpRequest req,
            [CosmosDB(
                databaseName: "ToDoItems",
                collectionName: "Items",
                ConnectionStringSetting = "CosmosDBConnection",
                Id = "{id}",
                PartitionKey = "{partitionKey}")] ToDoItem toDoItem,
            ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");

            if (toDoItem == null)
            {
                log.LogInformation($"ToDo item not found");
            }
            else
            {
                log.LogInformation($"Found ToDo item, Description={toDoItem.Description}");
            }
            return new OkResult();
        }
    }
}

HTTP-trigger, zoek de id van routegegevens op met behulp van SqlQuery

In het volgende voorbeeld ziet u een C#-functie die één document op haalt. De functie wordt geactiveerd door een HTTP-aanvraag die routegegevens gebruikt om de id op te geven die moet worden opgevraagd. Deze id wordt gebruikt om een ToDoItem document op te halen uit de opgegeven database en verzameling.

In het voorbeeld ziet u hoe u een bindingexpressie gebruikt in de SqlQuery parameter . U kunt routegegevens doorgeven aan de parameter zoals weergegeven, maar op dit moment kunt u SqlQuery geen queryreekswaarden doorgeven.

Notitie

Als u alleen de id wilt opvragen, is het raadzaam om op te zoeken, zoals in de vorige voorbeelden, omdat er minder aanvraageenheden worden verbruikt. Punt-leesbewerkingen (GET) zijn efficiënter dan query's op id.

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Azure.WebJobs.Host;
using System.Collections.Generic;
using Microsoft.Extensions.Logging;

namespace CosmosDBSamplesV2
{
    public static class DocByIdFromRouteDataUsingSqlQuery
    {
        [FunctionName("DocByIdFromRouteDataUsingSqlQuery")]
        public static IActionResult Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post",
                Route = "todoitems2/{id}")]HttpRequest req,
            [CosmosDB("ToDoItems", "Items",
                ConnectionStringSetting = "CosmosDBConnection",
                SqlQuery = "select * from ToDoItems r where r.id = {id}")]
                IEnumerable<ToDoItem> toDoItems,
            ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");

            foreach (ToDoItem toDoItem in toDoItems)
            {
                log.LogInformation(toDoItem.Description);
            }
            return new OkResult();
        }
    }
}

HTTP-trigger, meerdere documenten downloaden met behulp van SqlQuery

In het volgende voorbeeld ziet u een C#-functie die een lijst met documenten op haalt. De functie wordt geactiveerd door een HTTP-aanvraag. De query wordt opgegeven in de SqlQuery kenmerkeigenschappen.

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Azure.WebJobs.Host;
using System.Collections.Generic;
using Microsoft.Extensions.Logging;

namespace CosmosDBSamplesV2
{
    public static class DocsBySqlQuery
    {
        [FunctionName("DocsBySqlQuery")]
        public static IActionResult Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]
                HttpRequest req,
            [CosmosDB(
                databaseName: "ToDoItems",
                collectionName: "Items",
                ConnectionStringSetting = "CosmosDBConnection",
                SqlQuery = "SELECT top 2 * FROM c order by c._ts desc")]
                IEnumerable<ToDoItem> toDoItems,
            ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");
            foreach (ToDoItem toDoItem in toDoItems)
            {
                log.LogInformation(toDoItem.Description);
            }
            return new OkResult();
        }
    }
}

HTTP-trigger, meerdere documenten downloaden met documentClient

In het volgende voorbeeld ziet u een C#-functie die een lijst met documenten op haalt. De functie wordt geactiveerd door een HTTP-aanvraag. De code maakt gebruik van een exemplaar dat door de DocumentClient Azure Cosmos DB binding om een lijst met documenten te lezen. Het DocumentClient exemplaar kan ook worden gebruikt voor schrijfbewerkingen.

Notitie

U kunt ook de IDocumentClient-interface gebruiken om het testen eenvoudiger te maken.

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.Documents.Client;
using Microsoft.Azure.Documents.Linq;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;
using System;
using System.Linq;
using System.Threading.Tasks;

namespace CosmosDBSamplesV2
{
    public static class DocsByUsingDocumentClient
    {
        [FunctionName("DocsByUsingDocumentClient")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post",
                Route = null)]HttpRequest req,
            [CosmosDB(
                databaseName: "ToDoItems",
                collectionName: "Items",
                ConnectionStringSetting = "CosmosDBConnection")] DocumentClient client,
            ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");

            var searchterm = req.Query["searchterm"];
            if (string.IsNullOrWhiteSpace(searchterm))
            {
                return (ActionResult)new NotFoundResult();
            }

            Uri collectionUri = UriFactory.CreateDocumentCollectionUri("ToDoItems", "Items");

            log.LogInformation($"Searching for: {searchterm}");

            IDocumentQuery<ToDoItem> query = client.CreateDocumentQuery<ToDoItem>(collectionUri)
                .Where(p => p.Description.Contains(searchterm))
                .AsDocumentQuery();

            while (query.HasMoreResults)
            {
                foreach (ToDoItem result in await query.ExecuteNextAsync())
                {
                    log.LogInformation(result.Description);
                }
            }
            return new OkResult();
        }
    }
}

HTTP-trigger, meerdere documenten downloaden met cosmosClient

In het volgende voorbeeld ziet u een C#-functie die een lijst met documenten op haalt. De functie wordt geactiveerd door een HTTP-aanvraag. De code maakt gebruik van een exemplaar dat wordt geleverd CosmosClient door de Azure Cosmos DB-binding, die beschikbaar is in extensieversie 4.x,om een lijst met documenten te lezen. Het CosmosClient exemplaar kan ook worden gebruikt voor schrijfbewerkingen.

using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.Cosmos;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Extensions.Logging;

namespace CosmosDBSamplesV2
{
    public static class DocsByUsingCosmosClient
    {  
        [FunctionName("DocsByUsingCosmosClient")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post",
                Route = null)]HttpRequest req,
            [CosmosDB(
                databaseName: "ToDoItems",
                containerName: "Items",
                Connection = "CosmosDBConnection")] CosmosClient client,
            ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");

            var searchterm = req.Query["searchterm"].ToString();
            if (string.IsNullOrWhiteSpace(searchterm))
            {
                return (ActionResult)new NotFoundResult();
            }

            Container container = client.GetDatabase("ToDoItems").GetContainer("Items");

            log.LogInformation($"Searching for: {searchterm}");

            QueryDefinition queryDefinition = new QueryDefinition(
                "SELECT * FROM items i WHERE CONTAINS(i.Description, @searchterm)")
                .WithParameter("@searchterm", searchterm);
            using (FeedIterator<ToDoItem> resultSet = container.GetItemQueryIterator<ToDoItem>(queryDefinition))
            {
                while (resultSet.HasMoreResults)
                {
                    FeedResponse<ToDoItem> response = await resultSet.ReadNextAsync();
                    ToDoItem item = response.First();
                    log.LogInformation(item.Description);
                }
            }

            return new OkResult();
        }
    }
}

Kenmerken en aantekeningen

Gebruik in C#-klassebibliothekenhet kenmerk CosmosDB.

De constructor van het kenmerk gebruikt de databasenaam en verzamelingsnaam. In extensieversie 4.x zijn sommige instellingen en eigenschappen verwijderd of hernoemd. Zie de volgende configuratiesectie voor informatie over instellingen en andere eigenschappen die u voor alle versies kunt configureren.

Configuratie

De volgende tabel bevat informatie over de bindingsconfiguratie-eigenschappen die u instelt in het bestand function.json en het kenmerk CosmosDB.

function.json-eigenschap Kenmerkeigenschap Beschrijving
type N.v.t. Moet worden ingesteld op cosmosDB.
direction N.v.t. Moet worden ingesteld op in.
name N.v.t. Naam van de bindingsparameter die het document in de functie vertegenwoordigt.
Databasenaam Databasenaam De database die het document bevat.
collectionName
of
containerName
NaamVerzameling
of
ContainerName
De naam van de verzameling die het document bevat.

In versie 4.x van de extensie wordt deze eigenschap ContainerName genoemd.
id Id De id van het document dat moet worden opgehaald. Deze eigenschap ondersteunt bindingexpressie. Stel niet zowel de eigenschappen als id de sqlQuery-eigenschappen in. Als u geen van beide in stelt, wordt de hele verzameling opgehaald.
sqlQuery SqlQuery Een Azure Cosmos DB SQL die wordt gebruikt voor het ophalen van meerdere documenten. De eigenschap ondersteunt runtimebindingen, zoals in dit voorbeeld: SELECT * FROM c where c.departmentId = {departmentId} . Stel niet zowel de eigenschappen als id sqlQuery in. Als u geen van beide in stelt, wordt de hele verzameling opgehaald.
connectionStringSetting
of
connection
ConnectionStringSetting
of
Verbinding
De naam van de app-instelling die uw Azure Cosmos DB connection string.

In versie 4.x van de extensie wordt deze eigenschap Connection genoemd. De waarde is de naam van een app-instelling die de connection string bevat of een configuratiesectie of voorvoegsel die de verbinding definieert. Zie Verbindingen.
partitionKey PartitionKey Hiermee geeft u de partitiesleutelwaarde voor de zoekactie op. Kan bindingsparameters bevatten. Dit is vereist voor opzoekingen in gepartities.
preferredLocations PreferredLocations (Optioneel) Definieert voorkeurslocaties (regio's) voor databaseaccounts met geo-replicatie in de Azure Cosmos DB service. Waarden moeten door komma's worden gescheiden. Bijvoorbeeld 'VS - oost,VS - zuid-centraal,Europa - noord'.

Wanneer u lokaal ontwikkelt, gaan app-instellingen in het bestand local.settings.json.

Gebruik

Wanneer de functie wordt afgesloten, worden alle wijzigingen die zijn aangebracht in het invoerdocument via benoemde invoerparameters automatisch persistent gemaakt.

Volgende stappen