聚合递归树结构(父引用)

时间:2017-08-01 13:26:24

标签: node.js mongodb mongoose

我们正在尝试构建一个可以管理页面及其子页面的简单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对结果进行排序。

0 个答案:

没有答案