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

В настоящее время у меня есть база данных с коллекцией под названием people.

Каждый документ содержит следующие свойства: city, state и country.

Пример:

{
    "_id": "5cd80e1ab3ee820fd9416301",
    "name": "John Doe",
    "city": "New York City",
    "state": "NY",
    "country": "US"
}

То, что я пытаюсь сделать, это собрать множество людей в каждом городе, в каждом штате, в каждой стране.

Пример:

{
    "US": {
        "NY": {
            "New York City": [
                {
                    "_id": "5cd80e1ab3ee820fd9416301",
                    "name": "John Doe"
                }
            ]
        }
    }
}

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

1 Ответ

0 голосов
/ 14 мая 2019

Я понял это.

db.people.aggregate([
    {
        $group: {
            _id: {
                country: "$country",
                state: "$state",
                city: "$city",
                person: "$$ROOT"
            }
        }
    },
    {
        $group: {
            _id: {
                country: "$_id.country",
                state: "$_id.state",
                city: "$_id.city",
                person: "$_id.person"
            },
            people: {
                $push: "$_id.person"
            }
        }
    },
    {
        $group: {
            _id: {
                country: "$_id.country",
                state: "$_id.state"
            },
            cities: {
                $push: {
                    city: "$_id.city",
                    people: "$people"
                }
            }
        }
    },
    {
        $group: {
            _id: {
                country: "$_id.country"
            },
            states: {
                $push: {
                    state: "$_id.state",
                    cities: "$cities"
                }
            }
        }
    },
    {
        $project: {
            _id: 0,
            country: "$_id.country",
            states: "$states"
        }
    }
]);

Результат будет выглядеть так:

{
    "country": "US",
    "states": [ 
        {
            "state": "NY",
            "cities": [ 
                {
                    "city": "New York City",
                    "people": [ 
                        {
                            "_id": "5cd80e1ab3ee820fd9416301",
                            "name": "John Doe",
                            "city": "New York City",
                            "state": "NY",
                            "country": "US"
                        }
                    ]
                }
            ]
        }
    ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...