Как агрегировать массивы во вложенные массивы по уровням? - PullRequest
0 голосов
/ 26 июня 2019

Мне нужна ваша помощь для запроса агрегации. Я провел несколько поисков перед публикацией, но ни один из найденных результатов не помог мне.

У меня есть сбор данных:

[
    { _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
                    }
                ]
            }
        ]
    }
]

Надеюсь, кто-нибудь поможет мне, спасибо.

1 Ответ

1 голос
/ 26 июня 2019

То, что вы пытаетесь сделать, это рекурсивная итерация для поиска детей. если вы уже знаете, как глубоко вы хотите пройти как один уровень или два уровня, то это хорошо. Вот запрос для перехода на два уровня с помощью вложенного поиска.

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'
        }        
    }
])

Это не очень хорошая идея, чтобы пойти гораздо глубже, потому что это может стоить вам высокой производительности.

лучший способ - определить схему таким образом, чтобы вам не нужно было углубляться.

Надеюсь, это поможет.

...