Как использовать JQ для фильтрации объекта на основе значения и возврата массива разных значений? - PullRequest
0 голосов
/ 09 июля 2020

У меня есть вызов, который возвращает большой массив объектов.

Объекты выглядят так:

{
  "accounts": [
    {
      "id": 1234,
      "name": "Sample Name",
      "status": "upgraded",
      "subscription": {
        "id": 4567,
        "products": [
          {
            "product_id": 5,
            "name": "Awesome Product",
            "units": 1,
            "price": 1
          },
          {
            "product_id": 1,
            "name": "Another Awesome Product",
            "units": 1,
            "price": 1
          }
        ]
      },
      "owner": {
        "id": 12345,
        "email": "email@email.com",
        "first_name": "John",
        "last_name": "Doe",
        "state": "active"
      }
    }
  ]
}

В этом массиве много разных объектов с разными владельцами , и я хочу вернуть массив, содержащий только идентификатор (первое свойство объекта), ЕСЛИ свойство owner равно 12345.

Пока что у меня есть

| jq -r '.accounts[] | [.id]'

, который возвращает ВСЕ "id" в объекте, но у меня возникли проблемы с фильтрацией этого массива на основе значения "owner"

Я пробовал добавить:

| jq -r '.accounts[] | [.id] | select(.id == 12345)'

Но сейчас выдает ошибку

Cannot index array with string "id"

Ответы [ 2 ]

3 голосов
/ 09 июля 2020

Вы были близки. Чтобы выбрать аккаунты , владелец id равен 12345, и извлечь их ( аккаунт , а не владельца s) id s, вы можете использовать это:

$ jq '.accounts | map(select(.owner.id == 12345) .id)' file
[
  1234
]
1 голос
/ 09 июля 2020

Другой вариант может быть

.accounts[]| select(.owner.id == 12345).id 

, который выводит:

1234
...