При этом выберите:
json_agg(json_build_object("id", price::money))
Я получаю результирующее значение:
[
{"6" : "$475.00"},
{"6" : "$1,900.00"},
{"3" : "$3,110.00"},
{"3" : "$3,110.00"}
]
Вместо этого я хотел бы получить данные в этом формате:
{
"6": ["$475.00","$1,900.00"],
"3": ["$3,110.00","$3,110.00"]
}
При запросе на сервере или использовании с jsonb идентификаторы дублируются, и только одна из пар ключ-значение проходит.

Вы должны агрегировать цены в группы по идентификаторам и использовать функцию агрегирования json_object_agg(). Вы должны использовать производную таблицу (подзапрос в предложении from), потому что агрегаты не могут быть вложенными:
select json_object_agg(id, prices)
from (
select id, json_agg(price::money) as prices
from my_table
group by id
) s
Все заключено в массив: [{"6" : ["475,00$", "1900,00$"]}, {"3" : ["3110,00$", "3110,00$"]}], я бы хотел, чтобы это было просто объект: {"6" : ["475.00$", "1900.00$"], "3" : ["3110.00$", "3110.00$"]}
Я понял, что неправильно отформатировал свой вопрос, я отредактировал его, чтобы отразить этот комментарий. Извиняюсь!
Возможно, array_agg (цена :: деньги) исправляет это, но без примеров данных сложно сказать.