将多值/数组 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 模板部署