首页 > 解决方案 > 如何编写一个 CosmosDBTrigger 来更新已更改的同一文档?

问题描述

我需要编写一个 CosmosDBTrigger 来更新已更改的文档。我看到有关输出文档的文档,这似乎涵盖了您只是将新文档写入 CosmosDB 的情况。但是,如何更新已更改的同一个文档呢?

 [FunctionName("MyFunctionName")]
 public static async Task RunAsync(
     [CosmosDBTrigger(
         databaseName: "MyDatabase",
         collectionName: "Orders",
         ConnectionStringSetting = "databaseConnection",
         MaxItemsPerInvocation = 1,
         CreateLeaseCollectionIfNotExists = true,
         LeaseDatabaseName = "TriggerLeases",
         LeaseCollectionName = "TriggerLeases",
         LeaseCollectionPrefix = "MyFunctionPrefix")]IReadOnlyList<Document> input,
     [CosmosDB(
         databaseName: "MyDatabase",
         collectionName: "Orders",
         ConnectionStringSetting = "databaseConnection", 
         Id = "{Id}")] MyCustomOrderObject output,
     ILogger log)
 {

标签: azure-functionsazure-cosmosdb

解决方案


如果通过 ID 匹配现有项,则输出绑定的行为是覆盖:

当您指定现有文档的 ID 时,它会被新的输出文档覆盖。

当然,在这种情况下,我们需要防止发生无限循环,如果我们总是更新触发的项目,导致另一个触发/更新等,并且永远如此。

另一种更复杂的控制方法是使用依赖注入来使用适当的存储库/服务类和完整的 Cosmos SDK,而不是输出绑定。因此,您从触发器接收更改的项目并将其交给您自己的服务以单独进行任何结果更改。如果您的应用程序中已经有一个抽象可以引入并使用以保持一致性,那么这可能会更可取。


推荐阅读