我使用PostgreSQL的ltree模块构建了这个材料化路径树结构。
我的目标是作为分层JSON树对象获取树 - 最好从某个起始和结束路径/点开始。
- id1
- id1.id2
- id1.id2.id3
- id1.id2.id5
- id1.id2.id3.id4 ... 等等
我的目标是作为分层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,则可能需要将问题更加概括为“材料化路径树到分层json”
此外,我正在考虑在所有节点上添加parent_id以及ltree路径,因为至少那样我就可以使用该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');
Node 5
的问题吗? - mbadawi23