Estou migrando um esquema do NoSQL para o postgres. O objeto de hoje " b
" existe no NoSQL como um elemento de objeto a
e parece na fonte assim ...
{
"a": {
"id": 1,
"b":{
"c1": {
"d1": 1,
"d2": 2
},
"c2": {
"d1": 1,
"d2": 2
},
"c3": {
"d1": 3,
"d2": 4
}
}
}
}
... que atribuí provisoriamente a um esquema semelhante ao ERD abaixo
+---+ +-----+ +---+ +---+
| b |<--<| b_d |>-->| d |>-->| c |
+---+ +-----+ +---+ +---+
Eu gostaria de poder recompor os dados normalizados no objeto original, mas não consegui fazê-lo. Em vez de obter " c
" objetos como pares de valores-chave diretos, estou obtendo objetos inteiros. Por exemplo ...
select
b_d.b_id,
json_agg(json_build_object(c.name,json_build_object('d1',d.d1,'d2',d.d2))) as b
from b_d
join d on d.id = b_d.d_id
join c on c.id = d.c_id
group by b_d.b_id;
... retorna ...
[{
"c1 ": {
"d1": 1,
"d2": 2
}
},
{
"c2 ": {
"d1": 1,
"d2": 2
}
},
{
"c3 ": {
"d1": 3,
"d2": 4
}
}]
...que você notará que tem um nível de aninhamento adicional em relação ao objeto de origem. Suspeito que tenha errado de cara, json_build_object
mas até agora não consegui reconstruir com sucesso o b
objeto " " como aparece no documento json original.
O que modifico na consulta e/ou no esquema subjacente para normalizar e desnormalizar esse objeto?
Em vez de procurar na página de documentos de funções json, procure na página de documentos de funções agregadas .
jsonb_object_agg()
agregará o objeto sem um nível adicional de aninhamento como visto nesta demonstração ....retorna o objeto original conforme desejado.
Veja também