Использование jsonPath для поиска строки

Я пытаюсь использовать jsonPath и функцию выбора, чтобы определить, должно ли правило выполняться или нет на основе текущего домена. Упрощенная версия того, что я делаю, здесь:

    global 
{
    dataset shopscotchMerchants <- "https://s3.amazonaws.com/app-files/dev/merchantJson.json" cachable for 2 seconds
}

rule checkdataset is active
{
    select when pageview ".*" setting ()
    pre
    {
        merchantData = shopscotchMerchants.pick("$.merchants[?(@.merchant=='Telefora')]");
    }
    emit 
    <|
        console.log(merchantData);
    |>
}

Я ожидаю, что консольный вывод - это telefora object, вместо этого я получаю все три объекта из файла json.

Если вместо merchant=='Telefora' я использую merchantID==16, то это прекрасно работает. Я думал, что jsonPath может также сопоставлять строки. Хотя в приведенном выше примере поиск не выполняется в части json с merchantDomain, у меня возникла та же проблема.

1 ответ

Решение

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

Просто поменять местами == за eq в вас JSONpath фильтр выражения и вам будет хорошо идти:

    global 
{
    dataset shopscotchMerchants <- "https://s3.amazonaws.com/app-files/dev/merchantJson.json" cachable for 2 seconds
}

rule checkdataset is active
{
    select when pageview ".*" setting ()
    pre
    {
        merchantData = shopscotchMerchants.pick("$.merchants[?(@.merchant eq 'Telefora')]"); // replace == with eq
    }
    emit 
    <|
        console.log(merchantData);
    |>
}

Я проверил это в своем собственном наборе тестовых правил, источник которого приведен ниже:

ruleset a369x175 {
  meta {
    name "test-json-filtering"
    description <<

    >>
    author "AKO"
    logging on
  }

  dispatch {
      domain "exampley.com"
  }

  global {
    dataset merchant_dataset <- "https://s3.amazonaws.com/app-files/dev/merchantJson.json" cachable for 2 seconds
  }

  rule filter_some_delicous_json {
    select when pageview "exampley.com"
    pre {
        merchant_data = merchant_dataset.pick("$.merchants[?(@.merchant eq 'Telefora')]");
    }
    {
        emit <|
            try { console.log(merchant_data); } catch(e) { }
        |>;
    }
  }
}
Другие вопросы по тегам