聚合recursion树结构(父引用)

我们正在尝试构build一个可以pipe理页面及其子页面的简单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结合使用MongoDB,或者我们需要用JS对结果进行sorting。