You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Kusto中从JSON里查找指定键值对的对象

Kusto查询JSON数组满足指定条件的解决方案

问题场景

已解析出如下结构的JSON数据:

{
  "wData": [
    {
      "fieldId": "my.field.A",
      "value": "Rainy"
    },
    {
      "fieldId": "my.field.B",
      "value": "Sunny"
    },
    {
      "fieldId": "tags",
      "value": "uuid:0001"
    }
  ]
}

需要实现两类查询:

  1. 单条件判断:数组中是否存在fieldId为my.field.B且value为Sunny的对象,返回布尔值
  2. 多条件判断:数组中同时存在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 05:13:21