我们正在尝试构建一个可以管理页面及其子页面的简单CMS。每个子页面也可以有子页面等。
我们目前面临的问题是我们在第二级之后收到一棵平面树,我们将不得不用JS重新组织树。
是否可以在不使用JS的情况下接收真实的树结构(参见“所需的输出”)。
目前使用以下树结构:
[{
_id: 1,
name: "top-level",
parent: null
},{
_id: 2,
name: "second-level-a",
parent: 1 // top-level
},{
_id: 3,
name: "second-level-b",
parent: 1 // top-level
},{
_id: 4,
name: "third-level",
parent: 2 // second-level-a
}]
我们目前正在尝试通过此查询接收完整的树:
Page.aggregate([
{
"$graphLookup": {
"from": "Page",
"startWith": "$_id",
"connectFromField": "_id",
"connectToField": "parent",
"as": "subPages",
"maxDepth": 1,
"depthField": "depth"
}
}, {
"$match": {
"options.parent": null
}
}
]).exec((err, pages) => {
if (err) {
res.send(err);
return;
}
res.json(pages);
});
我们收到的是这样的:
[
{
_id: 1,
name: "first-level",
parent: null,
subPages: [
{
_id: 2,
name: "second-level-a",
depth: 0,
[...]
},{
_id: 3,
name: "second-level-b",
depth: 0,
[...]
},{
_id: 4,
name: "third-level",
depth: 1,
[...]
}
]
}
]
使用此输出,它不会直接显示在树中放置第三级的位置。所需的输出应如下所示:
[
{
_id: 1,
name: "first-level",
parent: null,
subPages: [
{
_id: 2,
name: "second-level-a",
depth: 0,
[...]
subPages: [
{
_id: 4,
name: "third-level",
depth: 1,
[...]
}
]
},{
_id: 3,
name: "second-level-b",
depth: 0,
[...]
}
]
}
]
问题是,甚至可以将MongoDB与mongoose结合使用,还是需要使用JS对结果进行排序。