Привязки Azure Cosmos DB для службы "Функции Azure" версии 1.х

В этой статье описывается использование привязок Azure Cosmos DB в службе "Функции Azure". Служба "Функции Azure" поддерживает привязки триггера, а также входные и выходные привязки для Azure Cosmos DB.

Примечание

Эта статья предназначена для службы "Функции Azure" версии 1.x. Сведения об использовании этих привязок в Функциях 2.x см. в разделе Привязки Azure Cosmos DB для службы "Функции Azure" версии 2.х.

Эта привязка называлась DocumentDB. В Функции Azure версии 1.x только триггер был переименован в Azure Cosmos DB; входная привязка, выходная привязка и пакет NuGet сохраняют имя DocumentDB.

Примечание

Привязки Azure Cosmos DB поддерживаются только для использования с API SQL. Для всех остальных API Azure Cosmos DB необходимо получить доступ к базе данных из функции с помощью статического клиента для API, включая Azure Cosmos DB для MongoDB, Azure Cosmos DB для Apache Cassandra, Azure Cosmos DB для Apache Gremlin и Azure Cosmos DB для таблицы.

Пакеты – Функции 1.x

Привязки Azure Cosmos DB для Функций 1.x доступны в пакете NuGet Microsoft.Azure.WebJobs.Extensions.DocumentDB версии 1.х. Исходный код для привязок находится в репозитории GitHub azure-webjobs-sdk-extensions.

В следующей таблице указано как добавить поддержку для этой привязки в каждой среде разработки.

Среда разработки Для добавления поддержки в
Функции 1.x
Локальная разработка – библиотека классов C# Установка пакета
Локальная разработка – Скрипт C#, JavaScript, F# Автоматически
Разработка на портале Автоматически

Триггер

Триггер Azure Cosmos DB использует канал изменений Azure Cosmos DB для ожидания вставок и обновлений в разных разделах. На канале изменений публикуются вставки и обновления, а не удаления.

Пример триггера

В следующем примере показана внутрипроцессная функция C# , которая вызывается при вставке или обновлении в указанной базе данных и коллекции.

using Microsoft.Azure.Documents;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using System.Collections.Generic;

namespace CosmosDBSamplesV1
{
    public static class CosmosTrigger
    {
        [FunctionName("CosmosTrigger")]
        public static void Run([CosmosDBTrigger(
            databaseName: "ToDoItems",
            collectionName: "Items",
            ConnectionStringSetting = "CosmosDBConnection",
            LeaseCollectionName = "leases",
            CreateLeaseCollectionIfNotExists = true)]IReadOnlyList<Document> documents,
            TraceWriter log)
        {
            if (documents != null && documents.Count > 0)
            {
                log.Info($"Documents modified: {documents.Count}");
                log.Info($"First document Id: {documents[0].Id}");
            }
        }
    }
}

Атрибуты триггера

Для внутрипроцессных библиотек классов C# используйте атрибут CosmosDBTrigger .

Конструктор атрибута принимает имя базы данных и имя коллекции. Дополнительные сведения о параметрах и других свойствах, которые можно настроить, см. в разделе Конфигурация триггера. Ниже приведен пример атрибута CosmosDBTrigger в сигнатуре метода:

    [FunctionName("DocumentUpdates")]
    public static void Run(
        [CosmosDBTrigger("database", "collection", ConnectionStringSetting = "myCosmosDB")]
    IReadOnlyList<Document> documents,
        TraceWriter log)
    {
        ...
    }

Полный пример см. в разделе Пример C# в триггере.

Конфигурация триггера

В следующей таблице описываются свойства конфигурации привязки, которые задаются в файле function.json и атрибуте CosmosDBTrigger.

свойство function.json Свойство атрибута Описание
type Недоступно Нужно задать значение cosmosDBTrigger.
direction Недоступно Нужно задать значение in. Этот параметр задается автоматически при создании триггера на портале Azure.
name Недоступно Имя переменной, используемое в коде функции, представляющей список документов с изменениями.
connectionStringSetting ConnectionStringSetting Имя параметра приложения, содержащего строку подключения, используемую для подключения к отслеживаемой учетной записи Azure Cosmos DB.
databaseName DatabaseName Имя базы данных Azure Cosmos DB с отслеживаемой коллекцией.
collectionName CollectionName Имя отслеживаемой коллекции.
leaseConnectionStringSetting LeaseConnectionStringSetting (Необязательно.) Имя параметра приложения, содержащее строку подключения для службы, содержащей коллекцию аренды. Если значение не задано, используется значение connectionStringSetting. Этот параметр задается автоматически при создании привязки на портале. Строка подключения для коллекции аренд должна иметь разрешения на запись.
leaseDatabaseName LeaseDatabaseName (Необязательно.) Имя базы данных, в которой содержится коллекция, используемая для хранения аренд. Если значение не задано, используется значение параметра databaseName. Этот параметр задается автоматически при создании привязки на портале.
leaseCollectionName LeaseCollectionName (Необязательно.) Имя коллекции, используемой для хранения аренд. Если значение не задано, используется значение leases.
createLeaseCollectionIfNotExists CreateLeaseCollectionIfNotExists (Необязательно.) Если задано значение true, коллекция аренд создается автоматически, если она не создана. Значение по умолчанию — false.
leasesCollectionThroughput LeasesCollectionThroughput (Необязательно.) Определяет количество единиц запросов для назначения при создании коллекции аренд. Этот параметр используется, только если для createLeaseCollectionIfNotExists задано значение true. Этот параметр задается автоматически при создании привязки с помощью портала.
leaseCollectionPrefix LeaseCollectionPrefix (Дополнительно) Если параметр задан, то он добавляет префикс к созданной аренде в коллекции аренды для этой функции, позволяя двум разным функциям Azure совместно эффективно использовать коллекцию аренд с помощью различных префиксов.
feedPollDelay FeedPollDelay (Дополнительно) Если параметр задан, то он определяет задержку между опросами секции на наличие новых изменений в веб-канале, после того как все текущие изменения будут утеряны (в миллисекундах). По умолчанию это 5000 (5 секунд).
leaseAcquireInterval LeaseAcquireInterval (Дополнительно) Если параметр задан, то он определяет интервал для запуска задачи вычисления при условии равномерности распределения секций между известными экземплярами узла (в миллисекундах). По умолчанию это 13000 (13 секунд).
leaseExpirationInterval LeaseExpirationInterval (Дополнительно) Если параметр задан, то он определяет интервал, за который берется аренда, представляющая секцию (в миллисекундах). Если аренда не будет обновлена в течение этого интервала, это приведет к ее истечению и владение секцией перейдет к другому экземпляру. По умолчанию это 60000 (60 секунд).
leaseRenewInterval LeaseRenewInterval (Дополнительно) Если параметр задан, то он определяет интервал продления для всех аренд в разделах, которые на данный момент занятые экземплярами (в миллисекундах). По умолчанию это 17000 (17 секунд).
checkpointFrequency CheckpointFrequency (Дополнительно) Если параметр задан, то он определяет интервал между контрольными точками аренды (в миллисекундах). После каждого вызова функции всегда используется значение по умолчанию.
maxItemsPerInvocation MaxItemsPerInvocation (Дополнительно) Если параметр задан, то он устанавливает максимально получаемое количество элементов за вызов функции.
startFromBeginning StartFromBeginning (Необязательно.) Если параметр задан, значит, триггер может начать чтение изменений с начала журнала коллекции, а не с текущего момента времени. Это возможно только при первом запуске триггера, так как при последующих запусках контрольные точки уже будут сохранены. Если установить значение true для этого параметра при уже созданных арендах, этот параметр не будет иметь никакого эффекта.

Если разработка ведется на локальном компьютере, добавьте параметры приложения в файл local.settings.json в коллекции Values.

Использование триггера

Триггеру требуется вторая коллекция, которая используется для хранения аренды в разделах. Отслеживаемая коллекция и та, в которой содержатся аренды, должны быть доступны для успешной работы триггера.

Важно!

Если несколько функций настроены для использования триггера Azure Cosmos DB для одной и той же коллекции, каждая из функций должна использовать выделенную коллекцию аренды или указать разные LeaseCollectionPrefix для каждой функции. В противном случае активируется только одна из функций. Сведения о префиксе см. в разделе с конфигурацией.

Триггер не указывает, был ли документ обновлен или вставлен. Вместо этого он представляет сам документ. Если операции обновления и вставки необходимо обрабатывать по-разному, это можно сделать, внедрив поля меток времени для операций обновления и вставки.

Входные данные

Входная привязка Azure Cosmos DB извлекает один или несколько документов из Azure Cosmos DB и передает их входному параметру функции через API SQL. Идентификатор документа или параметры запроса можно определить по триггеру, который вызывает функцию.

Пример входных данных

Этот раздел содержит следующие примеры.

В примерах используется ToDoItem простого типа:

namespace CosmosDBSamplesV1
{
    public class ToDoItem
    {
        public string Id { get; set; }
        public string Description { get; set; }
    }
}

Триггер очереди, поисковый идентификатор из JSON

В следующем примере показана функция C#, которая получает один документ. Функция активируется сообщением из очереди, который содержит объект JSON. Очередь триггера анализирует JSON в объект с именем ToDoItemLookup, который содержит идентификатор для поиска. Этот идентификатор используется для получения ToDoItem документа из указанной базы данных и коллекции.

namespace CosmosDBSamplesV1
{
    public class ToDoItemLookup
    {
        public string ToDoItemId { get; set; }
    }
}
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;

namespace CosmosDBSamplesV1
{
    public static class DocByIdFromJSON
    {
        [FunctionName("DocByIdFromJSON")]
        public static void Run(
            [QueueTrigger("todoqueueforlookup")] ToDoItemLookup toDoItemLookup,
            [DocumentDB(
                databaseName: "ToDoItems",
                collectionName: "Items",
                ConnectionStringSetting = "CosmosDBConnection",
                Id = "{ToDoItemId}")]ToDoItem toDoItem,
            TraceWriter log)
        {
            log.Info($"C# Queue trigger function processed Id={toDoItemLookup?.ToDoItemId}");

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

Триггер HTTP, поисковый идентификатор из строки запроса

В следующем примере показана функция C#, которая получает один документ. Функция активируется HTTP-запросом, который в строке запроса указывает идентификатор для поиска. Этот идентификатор используется для получения ToDoItem документа из указанной базы данных и коллекции.

using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Azure.WebJobs.Host;
using System.Net;
using System.Net.Http;

namespace CosmosDBSamplesV1
{
    public static class DocByIdFromQueryString
    {
        [FunctionName("DocByIdFromQueryString")]
        public static HttpResponseMessage Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]HttpRequestMessage req,
            [DocumentDB(
                databaseName: "ToDoItems",
                collectionName: "Items",
                ConnectionStringSetting = "CosmosDBConnection",
                Id = "{Query.id}")] ToDoItem toDoItem,
            TraceWriter log)
        {
            log.Info("C# HTTP trigger function processed a request.");
            if (toDoItem == null)
            {
                log.Info($"ToDo item not found");
            }
            else
            {
                log.Info($"Found ToDo item, Description={toDoItem.Description}");
            }
            return req.CreateResponse(HttpStatusCode.OK);
        }
    }
}

Триггер HTTP, поисковый идентификатор из данных маршрута

В следующем примере показана функция C#, которая получает один документ. Функция инициируется HTTP-запросом, в котором с помощью данных маршрута указывается идентификатор для поиска. Этот идентификатор используется для получения ToDoItem документа из указанной базы данных и коллекции.

using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Azure.WebJobs.Host;
using System.Net;
using System.Net.Http;

namespace CosmosDBSamplesV1
{
    public static class DocByIdFromRouteData
    {
        [FunctionName("DocByIdFromRouteData")]
        public static HttpResponseMessage Run(
            [HttpTrigger(
                AuthorizationLevel.Anonymous, "get", "post",
                Route = "todoitems/{id}")]HttpRequestMessage req,
            [DocumentDB(
                databaseName: "ToDoItems",
                collectionName: "Items",
                ConnectionStringSetting = "CosmosDBConnection",
                Id = "{id}")] ToDoItem toDoItem,
            TraceWriter log)
        {
            log.Info("C# HTTP trigger function processed a request.");

            if (toDoItem == null)
            {
                log.Info($"ToDo item not found");
            }
            else
            {
                log.Info($"Found ToDo item, Description={toDoItem.Description}");
            }
            return req.CreateResponse(HttpStatusCode.OK);
        }
    }
}

Пропустить примеры входных данных

Триггер HTTP, поисковый идентификатор из данных маршрута, используется SqlQuery

В следующем примере показана функция C#, которая получает один документ. Функция инициируется HTTP-запросом, в котором с помощью данных маршрута указывается идентификатор для поиска. Этот идентификатор используется для получения ToDoItem документа из указанной базы данных и коллекции.

using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Azure.WebJobs.Host;
using System.Collections.Generic;
using System.Net;
using System.Net.Http;

namespace CosmosDBSamplesV1
{
    public static class DocByIdFromRouteDataUsingSqlQuery
    {
        [FunctionName("DocByIdFromRouteDataUsingSqlQuery")]
        public static HttpResponseMessage Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post",
                Route = "todoitems2/{id}")]HttpRequestMessage req,
            [DocumentDB(
                databaseName: "ToDoItems",
                collectionName: "Items",
                ConnectionStringSetting = "CosmosDBConnection",
                SqlQuery = "select * from ToDoItems r where r.id = {id}")] IEnumerable<ToDoItem> toDoItems,
            TraceWriter log)
        {
            log.Info("C# HTTP trigger function processed a request.");
            foreach (ToDoItem toDoItem in toDoItems)
            {
                log.Info(toDoItem.Description);
            }
            return req.CreateResponse(HttpStatusCode.OK);
        }
    }
}

Пропустить примеры входных данных

Триггер HTTP, получение нескольких документов, используется SqlQuery

В следующем примере показана функция C#, которая получает список документов. Функция активируется с помощью HTTP-запроса. Запрос указывается в свойстве атрибута SqlQuery.

using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Azure.WebJobs.Host;
using System.Collections.Generic;
using System.Net;
using System.Net.Http;

namespace CosmosDBSamplesV1
{
    public static class DocsBySqlQuery
    {
        [FunctionName("DocsBySqlQuery")]
        public static HttpResponseMessage Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]
                HttpRequestMessage req,
            [DocumentDB(
                databaseName: "ToDoItems",
                collectionName: "Items",
                ConnectionStringSetting = "CosmosDBConnection",
                SqlQuery = "SELECT top 2 * FROM c order by c._ts desc")]
                IEnumerable<ToDoItem> toDoItems,
            TraceWriter log)
        {
            log.Info("C# HTTP trigger function processed a request.");
            foreach (ToDoItem toDoItem in toDoItems)
            {
                log.Info(toDoItem.Description);
            }
            return req.CreateResponse(HttpStatusCode.OK);
        }
    }
}

Пропустить примеры входных данных

Триггер HTTP, получение нескольких документов, используется DocumentClient (C#)

В следующем примере показана функция C#, которая получает список документов. Функция активируется с помощью HTTP-запроса. Код использует экземпляр DocumentClient, предоставленный привязкой Azure Cosmos DB для считывания списка документов. Экземпляр DocumentClient может также использоваться для операций записи.

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 System;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;

namespace CosmosDBSamplesV1
{
    public static class DocsByUsingDocumentClient
    {
        [FunctionName("DocsByUsingDocumentClient")]
        public static async Task<HttpResponseMessage> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]HttpRequestMessage req,
            [DocumentDB(
                databaseName: "ToDoItems",
                collectionName: "Items",
                ConnectionStringSetting = "CosmosDBConnection")] DocumentClient client,
            TraceWriter log)
        {
            log.Info("C# HTTP trigger function processed a request.");

            Uri collectionUri = UriFactory.CreateDocumentCollectionUri("ToDoItems", "Items");
            string searchterm = req.GetQueryNameValuePairs()
                .FirstOrDefault(q => string.Compare(q.Key, "searchterm", true) == 0)
                .Value;

            if (searchterm == null)
            {
                return req.CreateResponse(HttpStatusCode.NotFound);
            }

            log.Info($"Searching for word: {searchterm} using Uri: {collectionUri.ToString()}");
            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.Info(result.Description);
                }
            }
            return req.CreateResponse(HttpStatusCode.OK);
        }
    }
}

Входные атрибуты

Во внутрипроцессных библиотеках классов C# используйте атрибут DocumentDB .

Конструктор атрибута принимает имя базы данных и имя коллекции. Дополнительные сведения о параметрах и других свойствах, которые можно настроить, см. в следующем разделе о настройке.

Входная конфигурация

В следующей таблице описываются свойства конфигурации привязки, которые задаются в файле function.json и атрибуте DocumentDB.

свойство function.json Свойство атрибута Описание
type Недоступно Нужно задать значение documentdb.
direction Недоступно Нужно задать значение in.
name Недоступно Имя параметра привязки, представляющего документ в функции.
databaseName DatabaseName База данных, содержащая документ.
collectionName CollectionName Имя коллекции, содержащей документ.
id Id Идентификатор документа, который нужно получить. Это свойство поддерживает выражения привязок. Не задавайте свойства id или sqlQuery одновременно. Если не задать ни одного из них, извлекается вся коллекция.
sqlQuery SqlQuery SQL-запрос к Azure Cosmos DB, используемый для извлечения нескольких документов. Свойство поддерживает привязки времени выполнения, как показано в примере: SELECT * FROM c where c.departmentId = {departmentId}. Не задавайте свойства id или sqlQuery одновременно. Если не задать ни одного из них, извлекается вся коллекция.
connection; ConnectionStringSetting Имя параметра приложения, содержащего строку подключения к Azure Cosmos DB.
partitionKey PartitionKey Задает значение ключа секции для поиска. Может включать параметры привязки.

Если разработка ведется на локальном компьютере, добавьте параметры приложения в файл local.settings.json в коллекции Values.

Использование входной привязки

Любые изменения, внесенные во входной документ посредством именованных входных параметров, сохраняются автоматически после успешного выхода из функции.

Выходные данные

Выходная привязка Azure Cosmos DB позволяет записать новый документ в базу данных Azure Cosmos DB с помощью API SQL.

Пример выходных данных

Этот раздел содержит следующие примеры.

  • Триггер очереди, запись одного документа
  • Триггер очереди, запись документов с помощью IAsyncCollector

В примерах используется ToDoItem простого типа:

namespace CosmosDBSamplesV1
{
    public class ToDoItem
    {
        public string Id { get; set; }
        public string Description { get; set; }
    }
}

Триггер очереди, запись одного документа

В следующем примере показана функция C#, которая добавляет документ в базу данных, используя данные, полученные из сообщения хранилища очередей.

using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using System;

namespace CosmosDBSamplesV1
{
    public static class WriteOneDoc
    {
        [FunctionName("WriteOneDoc")]
        public static void Run(
            [QueueTrigger("todoqueueforwrite")] string queueMessage,
            [DocumentDB(
                databaseName: "ToDoItems",
                collectionName: "Items",
                ConnectionStringSetting = "CosmosDBConnection")]out dynamic document,
            TraceWriter log)
        {
            document = new { Description = queueMessage, id = Guid.NewGuid() };

            log.Info($"C# Queue trigger function inserted one row");
            log.Info($"Description={queueMessage}");
        }
    }
}

Триггер очереди, запись документов при помощи IAsyncCollector

В следующем примере показана функция C#, которая добавляет коллекцию документов в базу данных с помощью данных, полученных из JSON сообщения очереди.

using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using System.Threading.Tasks;

namespace CosmosDBSamplesV1
{
    public static class WriteDocsIAsyncCollector
    {
        [FunctionName("WriteDocsIAsyncCollector")]
        public static async Task Run(
            [QueueTrigger("todoqueueforwritemulti")] ToDoItem[] toDoItemsIn,
            [DocumentDB(
                databaseName: "ToDoItems",
                collectionName: "Items",
                ConnectionStringSetting = "CosmosDBConnection")]
                IAsyncCollector<ToDoItem> toDoItemsOut,
            TraceWriter log)
        {
            log.Info($"C# Queue trigger function processed {toDoItemsIn?.Length} items");

            foreach (ToDoItem toDoItem in toDoItemsIn)
            {
                log.Info($"Description={toDoItem.Description}");
                await toDoItemsOut.AddAsync(toDoItem);
            }
        }
    }
}

Выходные атрибуты

Во внутрипроцессных библиотеках классов C# используйте атрибут DocumentDB .

Конструктор атрибута принимает имя базы данных и имя коллекции. Дополнительные сведения о параметрах и других свойствах, которые можно настроить, см. в разделе Выходная конфигурация. Ниже приведен пример атрибута DocumentDB в сигнатуре метода:

    [FunctionName("QueueToDocDB")]
    public static void Run(
        [QueueTrigger("myqueue-items", Connection = "AzureWebJobsStorage")] string myQueueItem,
        [DocumentDB("ToDoList", "Items", Id = "id", ConnectionStringSetting = "myCosmosDB")] out dynamic document)
    {
        ...
    }

Полный пример см. в разделе Выходные данные.

Выходная конфигурация

В следующей таблице описываются свойства конфигурации привязки, которые задаются в файле function.json и атрибуте DocumentDB.

свойство function.json Свойство атрибута Описание
type Недоступно Нужно задать значение documentdb.
direction Недоступно Нужно задать значение out.
name Недоступно Имя параметра привязки, представляющего документ в функции.
databaseName DatabaseName База данных, содержащая коллекцию, в которой создается документ.
collectionName CollectionName Имя коллекции, в которой создается документ.
createIfNotExists CreateIfNotExists Логическое значение, указывающее, будет ли создана коллекция при ее отсутствии. Значение по умолчанию — false, так как коллекции создаются с использованием зарезервированной пропускной способности, с которой связаны ценовые требования. Дополнительные сведения см. на странице с расценками.
partitionKey PartitionKey Если для CreateIfNotExists задано значение true, определяется путь к ключу раздела для созданной коллекции.
CollectionThroughput CollectionThroughput Если для CreateIfNotExists задано значение true, определяется пропускная способность созданной коллекции.
connection; ConnectionStringSetting Имя параметра приложения, содержащего строку подключения к Azure Cosmos DB.

Если разработка ведется на локальном компьютере, добавьте параметры приложения в файл local.settings.json в коллекции Values.

Использование выходной привязки

При записи в параметре вывода функции в базе данных по умолчанию создается документ, для которого автоматически создается GUID в качестве идентификатора документа. Идентификатор выходного документа можно определить, указав свойство id в объекте JSON, передаваемом в параметр вывода.

Примечание

Если указать идентификатор существующего документа, он перезаписывается новым выходным документом.

Исключения и коды возврата

Привязка Справочник
Azure Cosmos DB Коды состояния HTTP для Azure Cosmos DB

Дальнейшие действия