我有一个场景,我们将项目保存在一个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),这可以启动这个处理本身,但我喜欢无服务器的简单性功能应用程序,如果可能的话。
答案 0 :(得分:2)
操作范围限定为集合。您无法从集合A中的事件触发集合B中的操作。
您需要在您的应用层中实现此功能(如您所建议)或...将两种类型的文档存储在同一个集合中(常见方案)。您可能需要添加某种类型的doctype属性来帮助过滤查询,但由于文档是无模式的,因此您可以将异构文档存储在同一个集合中。
另外:您提到了Azure功能。在一个函数中,没有什么能阻止你进行多个数据库调用(例如,当集合a中发生某些事情并导致调用你的函数时,你的函数可以在集合b中执行一个操作)。请注意,这不会是交易性的。
答案 1 :(得分:0)
我知道这是一个非常老的问题。
Change Feed是为此确切情况而构建的。
在当今的Azure门户中,CosmosDB刀片中甚至还有一个菜单选项,该菜单选项使您可以基于一个集合中的更改创建和触发功能,从而可以检测到变化并对其做出反应,即在另一个集合中创建文档。