Sou novo no jq e estou tentando pegar alguns campos de uma resposta json. O campo de observação é o campo "chave" na subseção "funções". Aqui está um exemplo do formato de resposta:
{
"took": 755,
"timed_out": false,
"_shards": {
"total": 3,
"successful": 3,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 10000,
"relation": "gte"
},
"max_score": null,
"hits": []
},
"aggregations": {
"user_data": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "user1",
"doc_count": 872721,
"response_status": {
"buckets": {
"success": {
"from": 200,
"to": 300,
"doc_count": 872709,
"roles": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "example-role",
"doc_count": 872709
}
]
}
},
"failure": {
"from": 400,
"to": 500,
"doc_count": 0,
"roles": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": []
}
}
}
}
},
{
"key": "user2",
"doc_count": 2286,
"response_status": {
"buckets": {
"success": {
"from": 200,
"to": 300,
"doc_count": 2285,
"roles": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 2285,
"buckets": [
{
"key": "example-role",
"doc_count": 2285
}
]
}
},
"failure": {
"from": 400,
"to": 500,
"doc_count": 1,
"roles": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 1,
"buckets": [
{
"key": "example-role",
"doc_count": 1
}
]
}
}
}
}
},
{
"key": "user4",
"doc_count": 872721,
"response_status": {
"buckets": {
"success": {
"from": 200,
"to": 300,
"doc_count": 872709,
"roles": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": []
}
},
"failure": {
"from": 400,
"to": 500,
"doc_count": 0,
"roles": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": []
}
}
}
}
},
{
"key": "user4",
"doc_count": 1,
"response_status": {
"buckets": {
"success": {
"from": 200,
"to": 300,
"doc_count": 0,
"roles": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": []
}
},
"failure": {
"from": 400,
"to": 500,
"doc_count": 1,
"roles": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "example-role",
"doc_count": 1
}
]
}
}
}
}
}
]
}
}
}
Para explicar o objetivo final, estou reunindo dados agregados sobre sucessos/falhas de http por usuário e função do usuário. Nem todos os usuários têm funções, mas ainda quero dados para esses usuários, e é por isso que a consulta é estruturada dessa maneira.
Minha dúvida é como puxar o papel de um usuário, ou nulo se ele não tiver funções. Existem 3 casos claros no exemplo acima: um usuário com sucessos e sem falhas ou vice-versa que tem uma função, um usuário com ambos que tem uma função e um usuário que não tem funções. Consegui escrever este comando jq para filtrar quais usuários têm/não têm funções:
.aggregations|.user_data|.buckets[]|.response_status|.buckets|map(.roles|.buckets|map(has("key")))|flatten|any
Que para esses dados retorna isso:
true
true
false
true
Como faço para retornar o papel em si, se verdadeiro, ou nulo, se falso, para que, neste exemplo, eu retorne:
"example-role"
"example-role"
null
"example-role"
Desde já, obrigado.