当前位置: 首页 > 知识库问答 >
问题:

在azure函数cosmosdb触发器中从集合中检索文档

巩子实
2023-03-14

我已经创建了一个azure函数,当一个新文档被添加到一个集合中时,它会被触发。

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

是否可以从该集合中选择特定文档,然后查询所选文档中的数据?

例如,在所谓的募集服装,我有一个文件,有一个ID: 12345Tops.我想查询ID为:12345Tops的文档中找到的数据。

或者检索集合中的第一个文档,然后查询第一个选定文档

我看过带有http触发器的azure函数:https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-cosmosdb#trigger---属性

但是我需要使用cosmosdb触发器,因为当文档被添加到集合中时需要触发它。

共有2个答案

单淳
2023-03-14

我认为你不必调用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 && input.Count > 0)
        {
            var changedDocumentjson = input[0].ToString();               
        }
    }
}
郏景澄
2023-03-14

如果我理解正确,您希望根据第一个集合上发生的更改查询第二个集合上的文档?

这当然是可行的,您需要使用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");
        }
    }
}
 类似资料:
  • 我们正在将数据从物联网设备发送到Azure物联网中心,并尝试将特定类型的消息传递给Azure功能。 目前,我们通过创建Azure Service Busendpoint并在IoTHub中创建消息路由实现了这一点。它按预期工作,Azure函数正确接收消息。 现在,我们想在Azure功能中从IoT Hub获取DeviceId,以及在Device Twin中定义的标签,我完全不知道如何做到这一点。 如果

  • 我有一个blob触发器Azure函数,每次将新文件添加到我的blob存储时都会调用该函数。我自动获取该文件的名称作为输入。除了名称之外,我还需要附加到给定文件的元数据。我一直在研究数据输入绑定,但我无法理解它。我需要做些什么才能将文件元数据作为输入?或者,甚至只是在我的函数中访问它?

  • 我将JSON文档上传到Azure Blob容器中,并编写了Azure Python函数将JSON写入CosmosDB。触发工作正常,但我出错了。下面是Python函数: 以下是function.json文件: 这是我在Azure门户中看到的错误: 结果:失败异常:函数加载错误:无法加载JsonBobTrigger1函数:以下参数在Python中声明,但在function.json中没有声明:{'d

  • 我对Typescript和CosmosDB是新手,这可能是一个相当愚蠢的问题,然而,我在网上搜索了一整天,也找不到适合我的解决方案。希望有人愿意帮忙。 select似乎不是typescript中定义的函数,有人能帮忙吗?

  • 下面是我的function.json 有什么想法可以摆脱这个“exception:attributeError:module'azure.functions'没有属性'in'”错误吗?

  • 我对azure非常陌生,正在努力处理eventGrid中的python函数触发器。我正在使用从azure为python创建的现成模板,并出现错误。我将共享这些文件。 (init.py) function.json 主机. json 这是我发送给事件网格的数据集 我得到的错误是 也许在上面的某个地方很容易出错,但我找不到。。 提前感谢!