Azure İşlevleri 2.x ve Cosmos için Azure Cosmos DB giriş bağlaması

Azure Cosmos DB giriş bağlaması SQL API'sini kullanarak bir veya daha fazla Azure Cosmos DB belgesini getirir ve işlevin giriş parametresine iletir. Belge kimliği veya sorgu parametreleri, işlevi çağıran tetikleyiciye göre belirlenebilir.

Kurulum ve yapılandırma ayrıntıları hakkında bilgi için bkz. genel bakış.

Not

Koleksiyon bölümlenmişse,arama işlemlerinin bölüm anahtarı değerini de belirtmesi gerekir.

Bu bölüm aşağıdaki örnekleri içerir:

Örnekler basit bir türe ToDoItem başvurur:

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

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

        public string Description { get; set; }
    }
}

Kuyruk tetikleyicisi, JSON'dan kimlik ara

Aşağıdaki örnek, tek bir belgeyi alan bir C# işlevini gösterir. İşlev, JSON nesnesi içeren bir kuyruk iletisiyle tetiklenir. Kuyruk tetikleyicisi, JSON'u arayacak kimlik ve bölüm anahtarı değerini ToDoItemLookup içeren türünde bir nesne olarak ayrıştırıyor. Bu kimlik ve bölüm anahtarı değeri, belirtilen veritabanı ve ToDoItem koleksiyondan belge almak için kullanılır.

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 tetikleyicisi, sorgu dizesinde kimlik arama

Aşağıdaki örnek, tek bir belgeyi alan bir C# işlevini gösterir. İşlev, arama için kimlik ve bölüm anahtarı değerini belirtmek için sorgu dizesi kullanan bir HTTP isteği tarafından tetiklenir. Bu kimlik ve bölüm anahtarı değeri, belirtilen veritabanı ve ToDoItem koleksiyondan belge almak için kullanılır.

Not

HTTP sorgu dizesi parametresi büyük/büyük/büyük harfe duyarlıdır.

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 tetikleyicisi, rota verilerinden kimlik ara

Aşağıdaki örnek, tek bir belgeyi alan bir C# işlevini gösterir. İşlev, arama için kimlik ve bölüm anahtarı değerini belirtmek için yol verilerini kullanan bir HTTP isteği tarafından tetiklenir. Bu kimlik ve bölüm anahtarı değeri, belirtilen veritabanı ve ToDoItem koleksiyondan belge almak için kullanılır.

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 tetikleyicisi, SqlQuery kullanarak yol verilerinden kimlik ara

Aşağıdaki örnek, tek bir belgeyi alan bir C# işlevini gösterir. İşlev, arama kimliğini belirtmek için yol verilerini kullanan bir HTTP isteği tarafından tetiklenir. Bu kimlik, belirtilen veritabanından ToDoItem ve koleksiyondan belge almak için kullanılır.

Örnek, parametresinde bağlama ifadesinin nasıl SqlQuery kullanılageldi. Yol verilerini parametresine gösterildiği SqlQuery gibi gönderebilirsiniz, ancak şu anda sorgu dizesi değerlerini geçemezsiniz.

Not

Yalnızca kimlikle sorgulamanız gerekirse, daha az istek birimi tükettiği için önceki örneklerde olduğu gibi bir arama kullanılması önerilir. Nokta okuma işlemleri (GET), kimlere göre sorgulardan daha verimlidir.

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 tetikleyicisi, SqlQuery kullanarak birden çok belge elde edin

Aşağıdaki örnek, belgelerin listesini alan bir C# işlevini gösterir. İşlev bir HTTP isteği tarafından tetiklenir. Sorgu öznitelik SqlQuery özelliğinde belirtilir.

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 tetikleyicisi, DocumentClient kullanarak birden çok belgeyi al

Aşağıdaki örnek, belgelerin listesini alan bir C# işlevini gösterir. İşlev bir HTTP isteği tarafından tetiklenir. Kod, belge DocumentClient listesini okumak için Azure Cosmos DB bağlaması tarafından sağlanan bir örneği kullanır. Örnek, DocumentClient yazma işlemleri için de kullanılabilir.

Not

Testi kolaylaştırmak için IDocumentClient arabirimini de kullanabilirsiniz.

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 tetikleyicisi, CosmosClient kullanarak birden çok belgeyi al

Aşağıdaki örnek, belgelerin listesini alan bir C# işlevini gösterir. İşlev bir HTTP isteği tarafından tetiklenir. Kod, belge listesini okumak için Azure Cosmos DB bağlaması tarafından sağlanan CosmosClient ve uzantı sürümü 4.x'tebulunan bir örneği kullanır. Örnek, CosmosClient yazma işlemleri için de kullanılabilir.

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();
        }
    }
}

Öznitelikler ve ek açıklamalar

C# sınıf kitaplıklarında CosmosDB özniteliğini kullanın.

Özniteliğin oluşturucusu veritabanı adını ve koleksiyon adını alır. Uzantı sürüm 4.x'te bazı ayarlar ve özellikler kaldırılmış veya yeniden adlandırılmıştır. Tüm sürümler için yapılandırabilirsiniz ayarlar ve diğer özellikler hakkında bilgi için aşağıdaki yapılandırma bölümüne bakın.

Yapılandırma

Aşağıdaki tabloda function.json dosyasında ayar istediğiniz bağlama yapılandırma özellikleri ve özniteliği açık CosmosDB bulunmaktadır.

function.json özelliği Öznitelik özelliği Description
Türü yok olarak ayarlanmış olması cosmosDB gerekir.
yön yok olarak ayarlanmış olması in gerekir.
Adı yok İşlevde belgeyi temsil eden bağlama parametresinin adı.
Databasename Databasename Belgeyi içeren veritabanı.
Toplamaadı
veya
containerName
CollectionName
veya
ContainerName
Belgeyi içeren koleksiyonun adı.

Uzantının 4.x sürümünde bu özellik olarak çağrılır. ContainerName
id Kimliği Alınmakta olan belgenin kimliği. Bu özellik bağlama ifadelerini destekler. ve id sqlQuery özelliklerini ayarlamayın. Bunlardan birini ayarlamıyorsanız koleksiyonun tamamı alınır.
Sqlquery Sqlquery Azure Cosmos DB SQL belge almak için kullanılan bir sorgu. özelliği, şu örnekte olduğu gibi çalışma zamanı bağlamalarını destekler: SELECT * FROM c where c.departmentId = {departmentId} . Hem hem de özelliklerini id sqlQuery ayarlamayın. Bunlardan birini ayarlamıyorsanız koleksiyonun tamamı alınır.
connectionStringSetting
veya
Bağlantı
ConnectionStringSetting
veya
Bağlantı
Azure Cosmos DB bağlantı dizenizi içeren uygulama ayarının adı.

Uzantının 4.x sürümünde bu özellik olarak çağrılır. Connection Değer, bağlantı dizesini içeren veya bağlantıyı tanımlayan bir yapılandırma bölümü ya da ön ek içeren bir uygulama ayarının adıdır. Bkz. Bağlantılar.
partitionKey PartitionKey Arama için bölüm anahtarı değerini belirtir. Bağlama parametreleri içerebilir. Bölümlenmiş koleksiyonlarda yapılan aramalar için gereklidir.
preferredLocations PreferredLocations (İsteğe bağlı) Azure Cosmos DB hizmetlerinde coğrafi olarak çoğaltılmış veritabanı hesapları için tercih edilen Cosmos tanımlar. Değerlerin virgülle ayrılmış olması gerekir. Örneğin, "Doğu ABD,Orta Güney ABD,Kuzey Avrupa".

Yerel olarak geliştirilirken, uygulama ayarları local.settings.jsdosyasınagider.

Kullanım

İşlevden başarıyla çıkılırsa, adlandırılmış giriş parametreleri aracılığıyla giriş belgesinde yapılan tüm değişiklikler otomatik olarak kalıcı olur.

Sonraki adımlar