Как найти определенный элемент в динамическом массиве в KQL?
Например. У меня есть массив json (то есть строка) [{"key": "foo", "val": "bar"}, {"key": "a", "val": "b"}] в KQL. Теперь я хочу узнать значение свойства val для объектов с ключом "a". Он может быть под любым индексом, а не только под индексом 1, как в примере выше.
Я нашел функцию array_index_of. Но, похоже, он не принимает никаких предикатов, он принимает только индекс, а я заранее не знаю индекс в моем случае.
Есть ли способ запросить массив JSON для элемента, который удовлетворяет некоторым условиям в KQL?
Я попробовал mv-expand, но, похоже, он отделяет key от val:
datatable (b: dynamic)
[
dynamic({"key": "foo", "val": "bar"}),
dynamic({"key": "a", "val": "b"})
]
| mv-expand b

В KQL вы можете использовать оператор mv-expand для работы с динамическими массивами, а затем использовать оператор mv-apply для фильтрации элементов на основе условия. В вашем случае, чтобы найти значение «var» с ключом «a», вам нужно что-то в области:
datatable jsonString string
[
'{"key": "foo", "val": "bar"}, {"key": "a", "val": "b"}',
'{"key": "x", "val": "y"}, {"key": "a", "val": "z"}'
]
| mv-apply parsedJson = parse_json(jsonString) on (
project key = tostring(parsedJson['key']), val = tostring(parsedJson['val'])
)
| where key == "a"
| project val
mv-apply parsedJson = parse_json(jsonString) on (...) Функция parse_json используется для преобразования строк JSON в столбце «jsonString» в объекты. Затем оператор mv-apply используется для применения этого синтаксического анализа к каждой строке таблицы данных, создавая новые столбцы «key» и «val» с извлеченными значениями.
где ключ == "а" Это фильтрует строки, чтобы оставить только те, где "ключ" является "а"
После выполнения запроса вы получите таблицу со значениями для объектов с ключом «а».
Редактировать: Чтобы получить ключ и значение в одной строке, вы можете использовать оператор mv-apply с оператором проекта. Это позволит вам применить проекцию к каждому элементу динамического массива и объединить свойства key и val в одну строку.
datatable jsonString string
[
'{"key": "foo", "val": "bar"}, {"key": "a", "val": "b"}',
'{"key": "x", "val": "y"}, {"key": "a", "val": "z"}'
]
| mv-apply parsedJson = parse_json(jsonString) on (
project key = tostring(parsedJson['key']), val = tostring(parsedJson['val'])
)
| where key == "a"
| project key, val
Вывод для меня с моими примерными данными:
| key | val |
|-----|-----|
| a | b |
| a | z |
Теперь я хочу узнать значение свойства
valдля объектов с ключом"a".
Я воспроизвел в своей среде, и ниже приведены ожидаемые результаты:
Вы можете просто использовать bag_unpack(), а затем получить значение, как показано ниже:
datatable (b: dynamic)
[
dynamic({"key": "foo", "val": "bar"}),
dynamic({"key": "a", "val": "b"})
]
|evaluate bag_unpack(b)
| where key contains "a"

Output:

Вы случайно не знаете, почему в моем примере выше он разбивает одну динамику на две части? Например. ключ foo и val bar оказываются в разных строках.
mv-exapnd разделяет динамический массив на основе запятых "," и новой строки, поэтому он делится таким образом, и это ожидаемое поведение.
Вы случайно не знаете, почему в моем примере выше он разбивает одну динамику на две части? Например. ключ foo и val bar оказываются в разных строках.