JMESPath查询布尔值?



我正在尝试开发表达式来查询Route53并取出我们的私有区域的ID。

问题是查询字符串返回一个空数组。

基础数据如下-运行aws route53 list-hosted-zones:

{
"HostedZones": [
{
"Id": "/hostedzone/Z030998332ZE45DV5X8L3",
"Name": "dev.initech.com.",
"CallerReference": "b00898ec-bd53-4551-8002-72a0822325e8",
"Config": {
"Comment": "Mainly used for certificates.",
"PrivateZone": false
},
"ResourceRecordSetCount": 10
},
{
"Id": "/hostedzone/Z062450333HHCLR5EM9XC",
"Name": "dev.initech.com.",
"CallerReference": "1a8f22d6-sam3-490b-8b76-9bc27bbdeb02",
"Config": {
"Comment": "",
"PrivateZone": true
},
"ResourceRecordSetCount": 9
}
]
}

我参考了AWS指南,想到了

aws route53 list-hosted-zones 
--query 'HostedZones[*].Config[?PrivateZone==`true`].Id'

但是我得到了一个空数组。
我认为Config.PrivateZone是一个布尔值,所以我尝试

aws route53 list-hosted-zones --query 'HostedZones[*].Config[?PrivateZone==true].Id'

没有错误,但仍然得到一个空数组。

我希望看到类似

的东西
[
"/hostedzone/Z062450333HHCLR5EM9XC"
]

我做错了什么?


我知道如何使用jq通过

jq '.[] | select(.Config.PrivateZone == true).Id' foo.json

但我仍然想知道如何在JMESPath中做到这一点,因为它现在困扰着我。

您做[?PrivateZone == true]而不是[?PrivateZone == `true`]是正确的,您错过的是过滤器需要发生在数组上的事实,而HostedZones[].Config是一个对象(或哈希)。

因为您实际寻找的是符合您要求的HostedZones列表,所以过滤器需要在该级别发生,因此过滤器需要检查Config.PrivateZone == true.

给出查询:

HostedZones[?Config.PrivateZone].Id

正如你所看到的,你甚至不需要== true部分,因为过滤器已经要计算一个布尔值,它是无用的。