过滤查询

时间:2018-03-12 16:38:38

标签: javascript azure azure-logic-apps

我正在构建一个使用Azure资源连接器获取资源列表的逻辑应用程序。然后,我想将结果过滤到标记名称为Microsoft.Computestop的{​​{1}}资源。

以下是我收到的没有任何过滤器

的资源片段
normal

正如您所看到的,底层资源不包含任何标记,就像列表中显示的许多其他标记一样

我使用标准{ "id": "/subscriptions/<subscription>/resourceGroups/Env1/providers/Microsoft.Compute/virtualMachines/MyVM1", "name": "MyVM1", "type": "Microsoft.Compute/virtualMachines", "location": "westeurope", "tags": { "stop": "normal" } }, { "id": "/subscriptions/<subscription>/resourceGroups/LogicApp/providers/Microsoft.Logic/workflows/DWSize-Check", "name": "DWSize-Check", "type": "Microsoft.Logic/workflows", "location": "westeurope", "tags": {} } Compose连接器尝试从我收到的Filter Array过滤掉。

以下是我希望用于过滤器命令的代码:

value

@and(contains(item()?['id'], '/Microsoft.Compute/virtualMachines/'), contains(item()?['tags'], variables('TagName')), contains(item()?['tags'], variables('TagValue'))) variables('TagName')将为variables('TagValue')stop,如我的结果摘要中列出的示例代码中所示。

但是,由于其他资源(例如normal)中未列出任何标记值,因此收到以下Microsoft.Logic/workflows错误:

  

InvalidTemplate。执行模板操作&#39; Filter_array&#39;   失败:评估&#39;查询&#39;行动&#39;其中&#39;表达   &#39; @contains(item()?[&#39; tags&#39;],变量(&#39; TagValue&#39;))&#39;失败了:&#39; The   模板语言功能&#39;包含&#39;期待它的第一个论点   &#39;集合&#39;是一个字典(对象),一个数组或一个字符串。该   提供的值类型为&#39; Null&#39;。&#39;。

有人知道如何解决这个问题吗?

我已尝试对此null进行类似的查询,只是为了查看它是否收到任何内容,但我仍然被@contains(item().tags?.stop, variables('TagValue'))响应阻止:(

我在Workflow Definition Language的帮助下尝试了上述内容,但仍然没有骰子。任何帮助将不胜感激。

修改

除了Thomas发布的答案之外,我还执行了以下操作(如下图所示)从结果中过滤出null并转到null,但我仍然无法访问TagName,即使我使用包含

TagValue

或只是试图寻找@and(contains(item()?['tags'], variables('TagName')), contains(item()?['tags'], variables('TagValue')))

的事件

TagValue

Filtered

1 个答案:

答案 0 :(得分:2)

您可以检查null并返回一个空值(在您的情况下为空数组)。

您可以使用此表达式替换item()?['tags']或创建变量:

if(equals(item()?['tags'], null), [], item()?['tags'])