如何在Kusto中从JSON里查找指定键值对的对象
Kusto查询JSON数组满足指定条件的解决方案
问题场景
已解析出如下结构的JSON数据:
{ "wData": [ { "fieldId": "my.field.A", "value": "Rainy" }, { "fieldId": "my.field.B", "value": "Sunny" }, { "fieldId": "tags", "value": "uuid:0001" } ] }
需要实现两类查询:
- 单条件判断:数组中是否存在
fieldId为my.field.B且value为Sunny的对象,返回布尔值 - 多条件判断:数组中同时存在
my.field.B对应Sunny、tags对应uuid:0001的两个对象,返回布尔值
之前尝试的错误写法及问题
单条件查询错误代码
| extend parsedData = parse_json(data) | mv-apply parsedData on ( extend wData = parsedData['wData'] | where wData .fieldId == 'my.field.B' and wData .value == 'Sunny' | extend hasData = iff(count() > 0, true, false) | project hasData )
报错信息:The aggregate function 'count' is not allowed in this context.(KS144)
问题:count()聚合函数不能直接在mv-apply的子查询中这样使用,需要用summarize处理聚合逻辑。
多条件查询错误代码
| where (wData.fieldId == 'my.field.B' and wData.value == 'Sunny') and (wData.fieldId == 'tags' and wData.value == 'uuid:0001')
问题:单个数组对象无法同时拥有两个不同的fieldId值,这种写法逻辑错误,无法匹配到任何结果。
正确解决方案
单条件查询写法
方法1:使用mv-apply + summarize
| extend parsedData = parse_json(data) | mv-apply wData = parsedData.wData on ( where wData.fieldId == 'my.field.B' and wData.value == 'Sunny' | summarize hasMatch = count() > 0 ) | project hasMatch
逻辑:通过mv-apply展开wData数组的每个元素,过滤出符合条件的元素后,用summarize统计匹配数量,判断是否大于0得到布尔结果。
方法2:使用array_length + filter(更简洁)
| extend parsedData = parse_json(data) | extend hasMatch = array_length(filter(parsedData.wData, x => x.fieldId == 'my.field.B' and x.value == 'Sunny')) > 0 | project hasMatch
逻辑:用filter函数从数组中筛选符合条件的元素,再通过array_length判断筛选结果的长度是否大于0,直接得到布尔值。
多条件查询写法
方法1:多次filter判断
| extend parsedData = parse_json(data) | extend hasB = array_length(filter(parsedData.wData, x => x.fieldId == 'my.field.B' and x.value == 'Sunny')) > 0 | extend hasTags = array_length(filter(parsedData.wData, x => x.fieldId == 'tags' and x.value == 'uuid:0001')) > 0 | extend hasAllMatches = hasB and hasTags | project hasAllMatches
逻辑:分别对两个条件进行筛选判断,再将两个布尔结果做逻辑与运算,得到最终是否同时满足的结果。
方法2:mv-apply + countif
| extend parsedData = parse_json(data) | mv-apply wData = parsedData.wData on ( summarize hasB = countif(wData.fieldId == 'my.field.B' and wData.value == 'Sunny') > 0, hasTags = countif(wData.fieldId == 'tags' and wData.value == 'uuid:0001') > 0 ) | extend hasAllMatches = hasB and hasTags | project hasAllMatches
逻辑:在mv-apply展开数组后,用countif分别统计每个条件的匹配次数,只要次数大于0就说明存在该条件的元素,最后将两个结果做逻辑与。
内容的提问来源于stack exchange,提问作者Dilber
相关产品推荐
相关产品推荐

