Сортировка коллекции MongoDB по одному и тому же ключу с разными значениями

#mongodb #sorting

#mongodb — монгодб #сортировка #mongodb

Вопрос:

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

 {
  "id":"1235432",
  "name":"John Smith",
  "occupation":"janitor",
  "salary":"30000"
},
{
  "id":"23412312",
  "name":"Mathew Colins",
  "occupation":"janitor"
  "salary":"32000"
},
{
  "id":"7353452",
  "name":"Depp Jefferson",
  "occupation":"janitor"
  "salary":"33000"
},
{
  "id":"342434212",
  "name":"Clara Smith",
  "occupation":"Accountant",
  "salary":"45000"
},
{
  "id":"794563452",
  "name":"Jonathan Drako",
  "occupation":"Accountant",
  "salary":"46000"
},
{
  "id":"8383747",
  "name":"Simon Well",
  "occupation":"Accountant",
  "salary":"41000"
}
  

и я пытаюсь отобразить только ТОП-2 с самой высокой зарплатой по роду занятий. На данный момент мой запрос выглядит примерно так:

 Stats.find({occupation:{$exists:true}}).populate('name').sort({salary:1}).limit(2)
  

при этом возвращается только 1 результат вместо одного от каждого занятия.

Как я могу изменить свой запрос, чтобы отобразить топ-2 по каждой профессии в разбивке по диапазону зарплат?

Ответ №1:

Вы можете использовать $aggregate , как указано ниже.

  db.collectionName.aggregate({$match:{occupation:{$exists:true}}},
    { $sort: {"salary":-1}},
    { $limit: 2},
   { $project: {"name":1,"salary":1,_id:0} })
  

Вывод JSON:

 {"name" : "Jonathan Drako",
"salary" : "46000"},
{"name" : "Clara Smith",
"salary" : "45000"}
  

Комментарии:

1. Я пытаюсь вывести топ-2 с самой высокой зарплатой, отображая зарплату и имя.

2. Чтобы отобразить зарплату и имя, вам нужно ввести $project в оба поля. Сейчас я обновил свою проверку ответов.

3. Спасибо! Это весьма полезно. Могу я просто спросить вас об ошибке «failedToParse», которая возникает после агрегирования базы данных.

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