Подтвердить что ты не робот

Сортировать по дате в структуре агрегации мангуста

Im работает над проектом nodejs + mongodb с использованием мангуста. Теперь я столкнулся с вопросом, на который я не знаю ответа. Я использую структуру агрегации для получения сгруппированных результатов. Группировка выполняется с датой, исключая поле данных времени, например: "2013 02 06". Код выглядит следующим образом:

MyModel.aggregate([
            {$match: {$and: [{created_date: {$gte: start_date}}, {created_date: {$lte: end_date}}]}},
            {$group: {
                _id: {
                    year: {$year: "$created_at"},
                    month: {$month: "$created_at"},
                    day: {$dayOfMonth: "$created_at"}
                },
                count: {$sum: 1}
            }},
            {$project: {
                date: {
                        year: "$_id.year",
                        month:"$_id.month",
                        day:"$_id.day"
                },
                count: 1,
                _id: 0
            }}
        ], callback);

Сгруппированные результаты являются совершенными, за исключением того, что они не сортируются. Вот пример вывода:

[
    {
        count: 1,
        date: {
            year: 2013,
            month: 2,
            day: 7
        }
    },
    {
        count: 1906,
        date: {
            year: 2013,
            month: 2,
            day: 4
        }
    },
    {
        count: 1580,
        date: {
            year: 2013,
            month: 2,
            day: 5
        }
    },
    {
        count: 640,
        date: {
            year: 2013,
            month: 2,
            day: 6
        }
    }
]

Я знаю, что сортировка выполняется, добавляя следующее: {$sort: val}. Но теперь я не уверен, что должно быть val, поэтому результаты будут отсортированы по дате, так как мой ключ группировки представляет собой объект из 3 значений, строящих дату. Кто-нибудь знает, как это можно сделать?

ИЗМЕНИТЬ Попробовали это, и это сработало:)

{$sort: {"date.year":1, "date.month":1, "date.day":1}}

4b9b3361

Ответ 1

Похоже, что этот вопрос имеет очень простой ответ:) Просто нужно отсортировать по нескольким вложенным столбцам следующим образом:

{$sort: {"date.year":1, "date.month":1, "date.day":1}}

Ответ 2

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

MyModel.aggregate([
            {$match: {$and: [{created_date: {$gte: start_date}}, {created_date: {$lte: end_date}}]}},
            {$group: {
                _id: {
                    year: {$year: "$created_at"},
                    month: {$month: "$created_at"},
                    day: {$dayOfMonth: "$created_at"}
                },
                count: {$sum: 1}
            }},
            {$project: {
                date: "$_id", // so this is the shorter way
                count: 1,
                _id: 0
            }},
            {$sort: {"date": 1} } // and this will sort based on your date
        ], callback);

Ответ 3

Это будет работать, если вы сортируете только по дате, если у вас есть другие columsn для сортировки. Вам нужно будет расширить _id