我有这个使用 PostgreSQL 的 ltree 模块构建的物化路径树结构。
- id1
- id1.id2
- id1.id2.id3
- id1.id2.id5
- id1.id2.id3.id4 ...等
我当然可以轻松地使用 ltree 从整个树或特定路径/子路径中获取所有节点,但是当我这样做时,自然得到的是很多行(这等于结束.. Golang/您使用的任何编程语言)
我所追求的是获取树 - 理想情况下从某个开始和结束路径/点 - 作为分层 JSON 树对象等
{
"id": 1,
"path": "1",
"name": "root",
"children": [
{
"id": 2,
"path": "1.2",
"name": "Node 2",
"children": [
{
"id": 3,
"path": "1.2.3",
"name": "Node 3",
"children": [
{
"id": 4,
"path": "1.2.3.4",
"name": "Node 4",
"children": [
]
}
]
},
{
"id": 5,
"path": "1.2.5",
"name": "Node 5",
"children": [
]
}
]
}
]
}
我从线性(非分层)行/数组/切片结果集中知道,我当然可以在 Golang 中爆炸路径并在那里创建必要的业务逻辑来创建这个 json,但是如果有一个方便的,它肯定会好得多直接用 PostgreSQL 实现这一点的方法。
那么,您将如何在 PostgreSQL 中将 ltree 树结构输出到 json - 可能是从开始到结束的路径?
如果你不知道 ltree,我想这个问题可以更概括为“Materalized path tree to hierachical json”
此外,我正在考虑在除了 ltree 路径之外的所有节点上添加 parent_id 的想法,因为至少那时我将能够使用递归调用使用该 id 来获取我猜想的 json ......我也有考虑过在该 parent_id 上放置一个触发器,以根据父 ID 发生更改的时间来管理路径(保持更新) - 我知道这是另一个问题,但也许你也可以告诉我你的意见,关于这个?
我希望一些天才可以帮助我解决这个问题。:)
为了您的方便,这里有一个示例创建脚本,您可以使用它来节省时间:
CREATE TABLE node
(
id bigserial NOT NULL,
path ltree NOT NULL,
name character varying(255),
CONSTRAINT node_pkey PRIMARY KEY (id)
);
INSERT INTO node (path,name)
VALUES ('1','root');
INSERT INTO node (path,name)
VALUES ('1.2','Node 1');
INSERT INTO node (path,name)
VALUES ('1.2.3','Node 3');
INSERT INTO node (path,name)
VALUES ('1.2.3.4','Node 4');
INSERT INTO node (path,name)
VALUES ('1.2.5','Node 5');