我正在将模式从 NoSQL 迁移到 postgres。今天的对象“ b
”作为对象的一个元素存在于 NoSQL 中,并且a
在源代码中看起来像这样......
{
"a": {
"id": 1,
"b":{
"c1": {
"d1": 1,
"d2": 2
},
"c2": {
"d1": 1,
"d2": 2
},
"c3": {
"d1": 3,
"d2": 4
}
}
}
}
...我暂时将其分配给类似于以下 ERD 的模式
+---+ +-----+ +---+ +---+
| b |<--<| b_d |>-->| d |>-->| c |
+---+ +-----+ +---+ +---+
我希望能够将规范化数据重新组合成原始对象,但我一直无法这样做。我没有将“ c
”对象作为直接键值对获取,而是获取整个对象。例如...
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;
...返回...
[{
"c1 ": {
"d1": 1,
"d2": 2
}
},
{
"c2 ": {
"d1": 1,
"d2": 2
}
},
{
"c3 ": {
"d1": 3,
"d2": 4
}
}]
...您会注意到,与源对象相比,它具有额外的嵌套级别。我怀疑我一开始就出错了,json_build_object
但到目前为止还无法成功地重建b
原始 json 文档中出现的“”对象。
我应该对查询和/或底层架构进行哪些修改以规范化和非规范化该对象?
不要查看 json 函数文档页面,而是查看聚合函数文档页面。如本演示
jsonb_object_agg()
所示,将聚合对象而无需额外的嵌套级别。...根据需要返回原始对象。
另请 参阅