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