KQL — извлечь значение свойства из массива объектов JSON на основе значения другого свойства

Предположим, у меня есть таблица с несколькими столбцами. Один из столбцов называется Details, имеет тип dynamic и представляет собой массив объектов JSON, подобных этому:

[
    {
        "key": "Name",
        "value": "Dave"
    },
    {
        "key": "Age",
        "value": "30"
    },
    {
        "key": "Gender",
        "value": "Male"
    }
]

Я хотел бы эффективно извлечь value из объекта, который имеет key = Gender, и сохранить его в новом поле под названием Gender. Однако объект с этим ключом не всегда будет находиться в поле, и в этом случае я хочу установить для него значение по умолчанию Undefined в моем извлеченном свойстве.

Итак, если бы у меня было:

datatable(d:dynamic)
[
    dynamic({
        "Details":[
            {"value":"Dave","key":"Name"},
            {"value":"Male","key":"Gender"},
            {"value":"30","key":"Age"}
        ]
    }),
    dynamic({
        "Details":[
            {"value":"Dan","key":"Name"},
            {"value":"40","key":"Age"}
        ]
    }),
]

Я бы хотел, чтобы мои две строки были:

Gender
------
Male
Undefined

Набор данных, который будет запрошен, будет иметь возраст до года и может содержать миллион строк, что может повлиять на подход.

Мне известны mv-extend и mv-apply, но я не думаю, что они сработают, поскольку при принятии решения о назначении значения по умолчанию или нет необходимо учитывать все содержимое массива.

Спасибо :)

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

ниже приведены два варианта, вы можете проверить, как они работают в вашем случае использования и соответствуют ли они вашим требованиям.

Обратите внимание, что если это общее требование к запросу, вы можете извлечь эту информацию во время приема, например. используя «сопоставление приема» или «политику обновления».

datatable(d:dynamic)
[
    dynamic({
        "Details":[
            {"value":"Dave","key":"Name"},
            {"value":"Male","key":"Gender"},
            {"value":"30","key":"Age"}
        ]
    }),
    dynamic({
        "Details":[
            {"value":"Dan","key":"Name"},
            {"value":"40","key":"Age"}
        ]
    }),
]
| project Gender = case (d !has 'Gender', 'Unknown', extract(@'{"value":"([^"]+)","key":"Gender"}', 1, tostring(d)))
Пол Мужской Неизвестный
datatable(d:dynamic)
[
    dynamic({
        "Details":[
            {"value":"Dave","key":"Name"},
            {"value":"Male","key":"Gender"},
            {"value":"30","key":"Age"}
        ]
    }),
    dynamic({
        "Details":[
            {"value":"Dan","key":"Name"},
            {"value":"40","key":"Age"}
        ]
    }),
]
| mv-apply details = d.Details on (
    summarize arr = make_set_if (details.value, details.key == "Gender")
    | project Gender = case(isnotnull(arr[0]), tostring(arr[0]), "Undefined")
)
| project Gender
Пол Мужской Неопределенный

Спасибо! Мне нужны были функции make_set_if () и case(). Я тоже рассматривал регулярное выражение, но чувствовал, что должен быть более красноречивый способ сделать это, поскольку многие журналы Azure структурированы именно так. Мне вполне комфортно работать с Regex, и я вполне рад использовать его там, где это необходимо, но я также осознаю мудрость использования регулярного выражения для решения проблемы — теперь у вас есть две проблемы.

Storage4852 14.07.2024 00:05

Другие вопросы по теме