1

我在 CosmosDB 中有 2 个集合,Stocks并且StockPrices.

StockPrices收藏包含所有历史价格,并不断更新。

我想创建 Azure 函数来侦听StockPrices更新 ( CosmosDBTrigger),然后Document对触发器传递的每个执行以下操作:

  1. Stocks在集合中查找具有匹配代码的股票
  2. Stocks更新收藏中的股票价格

我不能通过CosmosDB输入绑定来执行此操作,因为CosmosDBTrigger传递了 a List(绑定仅在触发器传递单个项目时才有效)。

我看到这个工作的唯一方法是如果我foreachCosmosDBTriggerList 上,并从我的函数体访问 CosmosDB 并执行上面的步骤 1 和 2。

问题:如何从我的函数中访问 CosmosDB?

4

2 回答 2

1

CosmosDB 的一种绑定形式是获取一个DocumentClient 实例,它提供了对容器的全方位操作。这样,您应该能够将更改提要触发器和项目操作组合到同一个函数中,例如:

[FunctionName("ProcessStockChanges")]
public async Task Run(
    [CosmosDBTrigger(/* Trigger params */)] IReadOnlyList<Document> changedItems,
    [CosmosDB(/* Client params */)] DocumentClient client,
    ILogger log)
{
    // Read changedItems, 
    // Create/read/update/delete with client
}

.NET Core 也可以使用依赖注入来为您的函数实例提供一个成熟的自定义服务/存储库类,以便与 Cosmos 接口。这是我的首选方法,因为我可以使用最新版本的 Cosmos SDK 进行验证、控制序列化等。

您可能是有意这样做的,但只是提到考虑将您的数据组合到一个容器中,该容器由例如记录类型(Stock/StockPrice)和标识符的组合分区。这简化了事情,并且相对于多个容器可以更具成本/资源效率。

于 2020-07-27T16:01:28.263 回答
0

最终接受了@Noah Stahl 的建议。将其留在这里作为替代方案。


无法弄清楚如何直接执行此操作,因此想出了一个解决方法:

  1. 添加带有输出绑定CosmosDBTriggerStockPrices集合的函数Queue
  2. foreach从触发器结束Documents,序列化并添加到Queue
  3. 添加函数 with QueueTrigger、集合的CosmosDB输入绑定Stocks(withPartitionKeyId设置为StockTicker)和集合的CosmosDB输出绑定Stocks
  4. Stock使用来自CosmosDB输入绑定的值更新QueueTrigger
  5. 将更新分配StockCosmosDB输出绑定参数(更新数据库中的记录)

这就是说,我想听听更直接的方法,因为我的方法似乎是一种 hack。

于 2020-07-26T23:51:29.830 回答