【问题标题】:Ansible json_query to filter list of dict with different keyAnsible json_query 过滤具有不同键的字典列表
【发布时间】:2021-04-03 03:20:32
【问题描述】:

这里是不同键的dict列表。

my_class:
  - teacher:
      first_name: 'Jay'
      last_name: 'Matt'
  - teacher:
      first_name: 'Rick'
      last_name: 'Cati'
  - student:
      first_name: 'Jay'
      last_name: 'Dito'

所以要找出所有名字为 Jay 的老师和学生,我使用以下查询:

my_class | json_query("[?*.first_name == 'Jay']")

但它什么也没返回。我怎样才能得到结果?

【问题讨论】:

    标签: ansible json-query


    【解决方案1】:

    例如

      - debug:
          msg: "{{ my_class|
                   json_query('[?teacher.first_name == `Jay`].teacher.last_name') }}"
    

    给予

      msg:
      - Matt
    

    【讨论】:

    • 感谢指正。关键是dict列表中可能有很多不同的键。这里的样本只有两个:教师和学生。但是 5 个或 10 个,甚至更多呢?我知道我可以查询每个键,然后将它们组合在一起,但只是想知道是否还有其他简单的方法。
    【解决方案2】:

    我找到了办法

    - name: Test Playbook
      hosts: localhost
      gather_facts: no
      connection: local
    
      vars:
        my_class:
          - TE:
              first_name: 'Jay'
              last_name: 'Matt'
              age: 38
          - TE:
               first_name: 'Rick'
               last_name: 'Cati'
               age: 40
           - ST:
               first_name: 'Helen'
               last_name: 'Pi'
               age: 19
           - ST:
               first_name: 'Jay'
               last_name: 'Dito'
               age: 18
      tasks:
      - name: Query person whose first name is Jay
        vars:
          query: "[?value.first_name == 'Jay']"
        debug:
          var: my_class|map('dict2items')|map('json_query',query)|map('items2dict')|list|select()|list
    

    结果如下:

    TASK [Query person whose first name is Jay] **************************************************************************************
    ok: [localhost] => {
        "my_class|map('dict2items')|map('json_query',query)|map('items2dict')|list|select()|list": [
            {
                "TE": {
                    "age": 38,
                    "first_name": "Jay",
                    "last_name": "Matt"
                }
            },
            {
                "ST": {
                    "age": 18,
                    "first_name": "Jay",
                    "last_name": "Dito"
                }
            }
        ]
    }
    

    欢迎任何 cmets。希望有更好的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-05
      • 2021-11-23
      • 1970-01-01
      相关资源
      最近更新 更多