Сортировка агрегатов mongodb
У меня есть база данных студентов и их контактные данные.
Я пытаюсь найти почтовый индекс, в котором размещается большинство студентов.
Документы для студентов выглядят примерно так...
{studentcode: 'smi0001', имя: 'bob', фамилия: 'smith', почтовый индекс: 2001}
Я думал, что могу использовать структуру агрегации, чтобы узнать почтовый индекс с большинством студентов, сделав что-то вроде...
db.students.aggregate({$project: { postcode: 1 }, $group: {_id: '$postcode', students: {$sum: 1}}})
это работает как ожидалось (возвращает почтовые индексы как _id
и количество студентов в каждом почтовом индексе как "ученики", но если я добавлю $sort
к конвейеру, он, похоже, попытается сортировать по всей коллекции учащихся, а не результаты операции $group
.
то, что я пытаюсь выглядеть...
db.students.aggregate({$project: { postcode: 1 }, $group: {_id: '$postcode', students: {$sum: 1}}, $sort: {_id: -1}})
но он возвращает всю коллекцию и игнорирует $project
и $group
...
Я что-то упускаю? Я думал, что просто смогу сортировать по убыванию числа студентов и вернуть первый предмет.
Заранее благодарим за любую помощь.
Ответы
Ответ 1
У тебя почти было это...
db.test.aggregate(
{$group: {_id: '$postcode', students: {$sum: 1}}},
{$sort: {_id: -1}}
);
дает (я добавил некоторые тестовые данные, соответствующие вашему образцу):
{
"result" : [
{
"_id" : 2003,
"students" : 3
},
{
"_id" : 2002,
"students" : 1
},
{
"_id" : 2001,
"students" : 2
}
],
"ok" : 1
}
У вас был внешний {}
вокруг всего, что вызывало некоторую путаницу. Группа и сортировка не работали как отдельные операции в конвейере.
Вам действительно не нужен проект для этого случая.
Обновление. Вы, вероятно, захотите отсортировать "ученики", например, чтобы сначала получить самые большие zipcodes (по населению):
db.test.aggregate(
{$group: {_id: '$postcode', students: {$sum: 1}}},
{$sort: {students: -1}}
);
Ответ 2
Я думаю, что ваш синтаксис немного ошибочен. Каждая операция агрегации в конвейере должна быть собственным документом.
db.students.aggregate( {$project: ...}, {$group: ...}, {$sort: ...} )
В вашем случае это должно быть:
db.students.aggregate(
{$project: { postcode: 1 }},
{$group: {_id: '$postcode', students: {$sum: 1}}},
{$sort: {students: -1}}
)
Я тестировал его в образце коллекции на основе вашей схемы, и он работает для меня, сортировка сгруппированных почтовых кодов по количеству студентов, по убыванию.