将多值/数组 GET 参数传递给 Azure Function 并在 CosmosDB 中使用

Posted

技术标签:

【中文标题】将多值/数组 GET 参数传递给 Azure Function 并在 CosmosDB 中使用【英文标题】:Pass multi-value / array GET parameter to Azure Function and use it in CosmosDB 【发布时间】:2018-11-02 16:34:44 【问题描述】:

我有一个 Azure 函数(http 触发),它从 CosmosDB (SQL API) 返回文档。

CosmosDB 已经集成,并且在我定义 SQL QUERY 时运行良好:

SELECT * FROM c where c.id = documentID

当我使用以下 url 触发 http 请求时,我将从数据库中获取 ID 为 1 的文档,正如预期的那样。

blub.azure.net/API/myFunc?documentID=1

现在我想在参数化 SQL 查询中使用多个 ID。我应该如何使用 Azure 做到这一点。通常我希望使用类似以下 URL 和 SQL Query 来获得所需的结果,但它不起作用:

blub.azure.net/API/myFunc?documentIDs=1&documentIDs=2

SELECT * FROM c WHERE c.id IN (documentIDs)

注意:我知道我也可以传递一个 json 字符串并在函数中对其进行解码,但 cosmodb 有超过 1500 万个条目,我无法将其传递给函数,过滤应该在 sql 端完成。所以我需要在它绑定到函数之前使用查询功能对其进行预过滤。

我的函数.json:


  "bindings": [
    
      "authLevel": "function",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req"
    ,
    
      "type": "http",
      "direction": "out",
      "name": "res"
    ,
    
      "type": "documentDB",
      "name": "lastDataPoints",
      "databaseName": "dp-db-04",
      "collectionName": "lastDataPointsCollection",
      "connection": "ldpdbconnectionstring",
      "direction": "in",
      "sqlQuery": "SELECT * FROM c WHERE c.id = documentID"
    
  ],
  "disabled": false

【问题讨论】:

这是你必须在你的 Azure 函数中实现的东西。您的问题不是很具体,但如果问题真的是“我怎样才能获得具有多个 ID 的多个文档”,那么我知道有两种方法。我推荐第一个 1. 执行 N 次读取/获取,定义如下:docs.microsoft.com/en-us/rest/api/cosmos-db/get-a-document 2. 执行查询,其中包含逻辑 OR:docs.microsoft.com/en-us/rest/api/cosmos-db/query-documents 感谢您的意见。 Azure 函数允许您将 cosmosDB 集合直接集成到函数中。然后将数据作为变量直接绑定到上下文中。您可以在集成 cosmosDB 集合的 SQL 查询中使用 http 查询参数。我在问题中描述了它是如何工作的。您的解决方案可以工作,但由于额外的 http 请求会产生巨大的延迟延迟。为什么在可以直接处理 SQL 时使用嵌套的 http 请求。 docs.microsoft.com/en-Us/azure/azure-functions/… 【参考方案1】:

没有办法添加数组参数。

“为了防止注入攻击,在 SqlQuery 属性中使用的任何绑定字符串在发送到您的 Document DB 数据库之前都将替换为 SqlParameter”。来自:

https://github.com/Azure/azure-webjobs-sdk-extensions/blob/4fabead81601aef32f87067dd7cb60bbf86681db/README.md#sql-query-support

【讨论】:

谢谢,但我想知道为什么?因为通常支持数组作为 DocumentDB 中的参数化 sql 参数:“参数值可以是任何有效的 JSON(字符串、数字、布尔值、null,甚至数组或嵌套的 JSON)”从azure.microsoft.com/en-us/blog/… 获得。我知道在 t-sql 中有类似 inarray(field, @qrray) 但在 azure 函数/documentDB 组合中实现数组似乎“复杂”

以上是关于将多值/数组 GET 参数传递给 Azure Function 并在 CosmosDB 中使用的主要内容,如果未能解决你的问题,请参考以下文章

将状态作为参数传递给环处理程序?

Terraform - 将类型对象作为参数传递给 Azure 模板部署

如何将参数传递给 Azure 机器学习服务中的训练脚本?

Twig+ Wordpress - 如何将数组参数传递给函数?

将数组作为命令行参数传递给 Asp.Net Core

如何将 url 中的工作簿参数传递给 Azure Monitor 工作簿?