Home > other >  jq How to filter array and add element
jq How to filter array and add element

Time:02-10

using jq i'm trying to add data to a specific element in my json below :

{
  "users": [
    {
      "username": "karim",
      "queue": [
        "default"
      ]
    },
    {
      "username": "admin",
      "queue": [
        "apps",
        "prod"
      ]
    }
  ]
}

what i want to do is to add items in queue[] of user admin like this

{
  "users": [
    {
      "username": "hive",
      "queue": [
        "default"
      ]
    },
    {
      "username": "admin",
      "queue": [
        "apps",
        "prod",
        "dev"
      ]
    }
  ]
}

This is the command i used

jq '.users[] | select(.username == "admin").queue  = ["dev"]' file.json

But the result is not as expected

{
  "username": "hive",
  "queue": [
    "default"
  ]
}
{
  "username": "admin",
  "queue": [
    "apps",
    "prod",
    "dev"
  ]
}

Why users array doesn't appear ? I need to keep it in the result

CodePudding user response:

With the pipe you are changing the context down to an array element, which is what you want for the selection. If you put parentheses around the pipe and the selection, you will keep the assignment and thus the filter's output on top-level:

jq '(.users[] | select(.username == "admin")).queue  = ["dev"]'
{
  "users": [
    {
      "username": "karim",
      "queue": [
        "default"
      ]
    },
    {
      "username": "admin",
      "queue": [
        "apps",
        "prod",
        "dev"
      ]
    }
  ]
}

Demo

  • Related