【问题标题】:How to aggregate arrays to nested arrays by level?如何按级别将数组聚合到嵌套数组?
【发布时间】:2019-11-07 21:11:39
【问题描述】:

我需要您的帮助来进行聚合查询。我在发布之前进行了一些搜索,但没有找到对我有用的结果。

我有数据收集:

[
    { _id: 1, name: 'AA' },
    { _id: 2, name: 'BB', parent: 1, ancestors: [1] },
    { _id: 3, name: 'CC' },
    { _id: 4, name: 'DD', parent: 3, ancestors: [3] },
    { _id: 5, name: 'DD', parent: 4, ancestors: [3, 4] }
]

我需要这样的结果:

[
    {
        _id: 1,
        name: 'AA',
        child:
            [
                {
                    _id: 2,
                    name: 'BB',
                    parent: 1,
                }
            ]
    },
    {
        _id: 3,
        name: 'CC',
        child: [
            {
                _id: 4,
                name: 'DD',
                parent: 3,
                child: [
                    {
                        _id: 5,
                        name: 'DD',
                        parent: 4
                    }
                ]
            }
        ]
    }
]

希望有人帮助我,谢谢。

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework aggregate-functions aggregation


    【解决方案1】:

    您正在尝试做的是子查找的递归迭代。 如果你已经知道你想去多深,比如一级或二级,那就没问题了。 这是使用嵌套查找进行两级深度的查询。

    db.users.aggregate([
        {
            $lookup: {
                let: { id: "$_id" },
                from: 'users',
                pipeline: [
                    {
                        $match: {
                            $expr: {
                                $eq: ["$$id", "$parent"]
                            }
                        }
                    },
                    {
                        $lookup: {
                            from: "users",
                            localField: '_id',
                            foreignField: 'parent',
                            as: "child"
                        }
                    }
                ],
                as: 'child'
            }        
        }
    ])
    

    深入研究不是一个好主意,因为它可能会降低您的性能。

    更好的方法是这样定义你的架构,这样你就不需要那么深入了。

    希望对你有帮助。

    【讨论】:

    • 感谢您的帮助。你能聚合更深的层次吗?
    • 是的,您可以通过查找管道。
    猜你喜欢
    • 2014-08-31
    • 2017-07-26
    • 1970-01-01
    • 2020-11-09
    • 2019-10-06
    • 2020-05-09
    • 2021-08-21
    • 2022-01-13
    • 2021-08-04
    相关资源
    最近更新 更多