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

Сортировка агрегатов 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... Я что-то упускаю? Я думал, что просто смогу сортировать по убыванию числа студентов и вернуть первый предмет. Заранее благодарим за любую помощь.

4b9b3361

Ответ 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}}
)

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