Извлекать документ из коллекции в Azure функция cosmosdb trigger

#azure-functions #azure-cosmosdb

#azure-функции #azure-cosmosdb

Вопрос:

Я создал функцию Azure, которая запускается при добавлении нового документа в коллекцию.

 public static void Run(IReadOnlyList<Document> input, ILogger log)
{
if (input != null amp;amp; input.Count > 0)
{
    log.LogInformation("Documents modified "   input.Count);
    log.LogInformation("First document Id "   input[0].Id);
}}
  

Возможно ли выбрать конкретный документ из этой коллекции, а затем запросить данные в этом выбранном документе?

Например. в коллекции под названием clothescollection у меня есть документ с идентификатором: 12345Tops. Я хочу запросить данные, найденные в документе, с идентификатором: 12345Tops.

Или альтернативно извлекать первый документ в коллекции, а затем запрашивать этот первый выбранный документ

я просмотрел функции Azure с http-триггерами: https://learn.microsoft.com/en-us/azure/azure-functions/functions-bindings-cosmosdb#trigger—attributes

но мне нужно использовать cosmosdb trigger, поскольку это должно запускаться при добавлении документа в коллекцию.

Ответ №1:

Если я правильно понимаю, вы хотите запросить документы во второй коллекции на основе изменений, которые происходят в первой коллекции?

Это, безусловно, выполнимо, вам нужно использовать привязку ввода Cosmos DB и извлечь DocumentClient экземпляр.

Код будет выглядеть примерно так:

 [FunctionName("CosmosTrigger")]
public static void Run([CosmosDBTrigger(
        databaseName: "ToDoItems",
        collectionName: "Items",
        ConnectionStringSetting = "CosmosDBConnection",
        LeaseCollectionName = "leases",
        CreateLeaseCollectionIfNotExists = true)]IReadOnlyList<Document> documents, 
    [CosmosDB(
        databaseName: "ToDoItems",
        collectionName: "CollectionToQuery",
        ConnectionStringSetting = "CosmosDBConnection")] DocumentClient client,
    ILogger log)
{
    foreach (var documentInsertedOrUpdated in documents)
    {
        try
        {
            // Do a read document on another collection
            var otherDocument = await client.ReadDocumentAsync(UriFactory.CreateDocumentUri("ToDoItems", "CollectionToQuery", "some-id-maybe-taking-it-from-the-documentInsertedOrUpdated"));
        }
        catch(Exception ex)
        {
            log.LogError(ex, "Failed to process document");
        }
    }
}
  

Комментарии:

1. Спасибо за ваш ответ. Нет, я хочу выбрать конкретный документ из коллекции и запросить эти данные в этом конкретном документе. Это будет сделано в Azure функция cosmosdb trigger

2. Триггер отправляет пакет документов, как я показал в ответе, затем вы можете использовать DocumentClient для выполнения любой операции, которую вы хотите, это может быть запрос, или, если вы хотите прочитать один документ, вы можете выполнить ReadDocumentAsync вместо CreateDocumentQuery .

3. если вы не знаете идентификатор требуемого документа, но знаете, что идентификатор содержит tops, возможно ли извлечь этот документ? Спасибо

4. Затем вы можете выполнить запрос, как в моем первоначальном примере, с фильтром CONTAINS в WHERE. На этом этапе у вас есть DocumentClient для выполнения всех запросов / операций чтения, которые вам требуются, на основе информации, поступающей от триггера

Ответ №2:

Я не думаю, что вам нужно вызывать CosmosDB для извлечения полного документа из триггера CosmosDB.

Вы должны быть в состоянии получить json и десериализовать до нужного вам типа. Пожалуйста, посмотрите приведенный ниже пример функции.

Вы могли бы просто выполнить toString(), чтобы извлечь содержимое документа из списка документов, которые передаются в функцию. Или вы могли бы напрямую десерализовать json в объект, который у вас есть.

 public static class CosmosDbAuditFunction
{
    [FunctionName("CosmosDbAuditFunction")]
    public static void Run([CosmosDBTrigger(
        databaseName: "DBNAME",
        collectionName: "COLLECTIONNAME",
        ConnectionStringSetting = "CosmosDbConnectionString",
        LeaseCollectionName = "LeaseCollection",
        CreateLeaseCollectionIfNotExists = true)]IReadOnlyList<Document> input, ILogger log)
    {
        if (input != null amp;amp; input.Count > 0)
        {
            var changedDocumentjson = input[0].ToString();               
        }
    }
}