Использование 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) { }
|>;
}
}
}