json_query использует содержит для поиска элемента в другом списке не удалось - PullRequest
1 голос
/ 09 мая 2020

У меня есть список образцов, и я хочу выбрать элемент, тип которого находится в списке разыскиваемых.

- name: Get item based on anther list
  vars: 
    samples:
      - { item: 10, type: sample-1 },
      - { item: 20, type: sample-11 },
      - { item: 30, type: sample-2 }
    wanted_list: [ sample-11, sample-2 ]
    query: "[?contains('{{wanted_list|to_json}}', type)]"
  debug:
    var: samples | json_query(query)

Результат:

TASK: Get item based on anther list
ok: [localhost] => {
    "samples|json_query(query)": [
        {
            "item": 10,
            "type": "sample-1"
        },
        {
            "item": 20,
            "type": "sample-11"
        },
        {
            "item": 30,
            "type": "sample-2"
        }
    ]
}

Я ожидал, что он будет только вернуть элементы 20 и 30. Но на самом деле он возвращает все 3. Похоже, что часть элемента списка sample-11 соответствует выборке 1.

Но на основе JMESPath do c содержит :

boolean contains (array | string $ subject, any $ search)

Если $ subject является массивом, эта функция возвращает true, если один из элементов в массиве равен к предоставленному значению $ search.

Таким образом, sample-1 не равно sample-11, и его не следует выбирать.

Ответы [ 2 ]

0 голосов
/ 09 мая 2020

Фильтры selectattr и map выполняют свою работу

- debug:
    msg: "{{ samples|
             selectattr('type', 'in', wanted_list)|
             map(attribute='item')|
             list }}"

дает

    "msg": [
        20,
        30
    ]

Примечания

  • Исправить синтаксис списка samples и убрать запятые в конце строк
  vars: 
    samples:
      - {item: 10, type: sample-1}
      - {item: 20, type: sample-11}
      - {item: 30, type: sample-2}
0 голосов
/ 09 мая 2020

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

  - name: Get item based on anther list
    vars: 
      samples:
        - { item: 10, type: sample-1 }
        - { item: 20, type: sample-11 }
        - { item: 30, type: sample-2 }
      wanted_list: [ sample-11, sample-2 ]
      query: "[?contains(`{{ wanted_list | to_json }}`, type)]"
    debug:
      msg: '{{ samples | json_query(query) }}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...