首页 > 解决方案 > 将多值/数组 GET 参数传递给 Azure Function 并在 CosmosDB 中使用

问题描述

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

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

SELECT * FROM c where c.id = {documentID}

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

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

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

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

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

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

我的function.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
}

标签: azureazure-functionsazure-cosmosdb

解决方案


无法添加数组参数。

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

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


推荐阅读