Postgresql: agregue objetos em uma matriz (json) (problemas de subconsulta)

8

Sinto muito pelo título vago, mas simplesmente não sei as palavras certas para descrever isso.

Eu tenho essa consulta que transforma um monte de colunas em um objeto que funciona muito bem:

SELECT row_to_json(t) FROM ( SELECT type, properties, geometry FROM "bgbCargoMinardJSON" ) t

No entanto, quero agrupar os objetos que se enquadram em uma determinada categoria em uma matriz. Esta categoria é definida por uma quarta coluna dentro da minha tabela denominada "cargoProductId". A matriz deve ter o valor de "cargoProductId" como chave. Assim:

"961":[ {"type":"Feature",.... {"type":"Feature",.... {"type":"Feature",.... ], "962":[ ..... ]

Então, eu tenho lutado com isso nas últimas 1 hora e meia. Eu realmente não tenho idéia de como fazer isso. Isto é o que eu tenho agora:

SELECT array_agg(row_to_json(t)) FROM ( SELECT type, properties, geometry FROM "bgbCargoMinardJSON" ) t) FROM "bgbCargoMinardJSON" GROUP BY "carProductId"

ervazu
fonte

Respostas:

9

Se você está na versão 9.4, algo como isto pode ser o que você procura:

select json_object(array_agg(id)::text[],array_agg(rw)::text[])
from( select id
           , ( select to_json(array_agg(row_to_json(t)))
               from (select typ,prop from bgb where id=b.id) t ) rw
      from bgb b
      group by id ) z;
Jack diz que tenta topanswers.xyz
fonte
Obrigado Jack! Formação sábia fez o truque! O único problema que estou tendo é que ele não fornece json válido (bem, tecnicamente, ele fornece). Há este texto para conversão json acontecendo como: {"3565": "[{\"type\":Eu tenho um apóstrofo antes de cada colchete e uma barra antes de cada apóstrofo. Eu tinha isso antes e é sempre algo com o tipo de dados. Por mais que seja verdade, não entendo completamente como funciona a consulta que você escreveu e, portanto, não sei onde e como consertar isso.
Ervazu
Esta provavelmente não é a melhor solução, mas eu apenas usei a função de substituição para corrigir isso. Mais uma vez obrigado pelo seu tempo!
Ervazu
11
isto funcionou para o meu caso:json_agg(to_json(items.*)) as "items"
ricka