Использование 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, вместо этого я получаю все три объекта из файла json.

Если вместо мерчанта=='Телефора' использовать мерчИд==16, то все отлично работает. Я думал, что jsonPath также может сопоставлять строки. Хотя в приведенном выше примере не выполняется поиск по части json, относящейся к торговому домену, у меня возникла та же проблема.


person trumans1    schedule 06.04.2011    source источник


Ответы (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) { }
        |>;
    }
  }
}
person Alex    schedule 06.04.2011
comment
Спасибо за объяснение разницы между eq и ==. Это сбило с толку 462 студента (и других новичков). - person Steve Nay; 06.04.2011
comment
Хороший! Я запутался, потому что просматривал настоящие документы jsonPath и смотрел, смогу ли я заставить их работать. Спасибо Алекс! - person trumans1; 06.04.2011
comment
Как бы выглядел оператор like в этой ситуации? У меня возникли проблемы с тем, чтобы регулярное выражение работало. - person trumans1; 06.04.2011