每次创建CosmosDB文档时运行Azure功能应用程序并更新第二个集合中的文档

时间:2017-07-09 22:33:07

标签: azure azure-cosmosdb azure-functions

我有一个场景,我们将项目保存在一个documentDb集合中,例如在/items/{documentId}下。该文件类似于:

{
    id: [guid],
    rating: 5,
    numReviews: 1
}

我在/user-reviews/{userIdAsPartitionKey}/{documentId}

下有第二个文件集

该文件将如下所示:

{
    id: [guid],
    itemId: [guidFromItemsCollection],
    userId: [userId],
    rating: 4
}

上传此文档后,我希望触发一个触发器,该触发器将此新用户评级文档作为输入,能够从items集合中检索相关文档,转换items文档基于新数据。

我的问题的关键在于:如何触发文档upsert,以及如何从Funciton App中的其他集合中检索和修改文档?

我已经研究了以下链接,这些链接可以解释CosmosDB上可以触发的概念,但是该表表明我们无法连接文档数据库上传的触发器。 https://docs.microsoft.com/en-us/azure/azure-functions/functions-triggers-bindings https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-documentdb

如果无法直接设置,我的假设是我应该有一个处理upsert的中间层服务(目前正在使用客户端的DocumentClient),这可以启动这个处理本身,但我喜欢无服务器的简单性功能应用程序,如果可能的话。

2 个答案:

答案 0 :(得分:2)

操作范围限定为集合。您无法从集合A中的事件触发集合B中的操作。

您需要在您的应用层中实现此功能(如您所建议)或...将两种类型的文档存储在同一个集合中(常见方案)。您可能需要添加某种类型的doctype属性来帮助过滤查询,但由于文档是无模式的,因此您可以将异构文档存储在同一个集合中。

另外:您提到了Azure功能。在一个函数中,没有什么能阻止你进行多个数据库调用(例如,当集合a中发生某些事情并导致调用你的函数时,你的函数可以在集合b中执行一个操作)。请注意,这不会是交易性的。

答案 1 :(得分:0)

我知道这是一个非常老的问题。

Change Feed是为此确切情况而构建的。

在当今的Azure门户中,CosmosDB刀片中甚至还有一个菜单选项,该菜单选项使您可以基于一个集合中的更改创建和触发功能,从而可以检测到变化并对其做出反应,即在另一个集合中创建文档。