Сортировка MongoDB: эквивалентный запрос агрегирования - PullRequest
1 голос
/ 03 августа 2020

У меня есть следующие студенты коллекция

{ "_id" : ObjectId("5f282eb2c5891296d8824130"), "name" : "Rajib", "mark" : "1000" }
{ "_id" : ObjectId("5f282eb2c5891296d8824131"), "name" : "Rahul", "mark" : "1200" }
{ "_id" : ObjectId("5f282eb2c5891296d8824132"), "name" : "Manoj", "mark" : "1000" }
{ "_id" : ObjectId("5f282eb2c5891296d8824133"), "name" : "Saroj", "mark" : "1400" }

Мое требование - отсортировать коллекцию на основе поля ' mark ' в порядке убывания порядок. Но он не должен отображать поле ' mark ' в конечном результате. Результат должен быть следующим:

{ "name" : "Saroj" }
{ "name" : "Rahul" }
{ "name" : "Rajib" }
{ "name" : "Manoj" }

Следующий запрос, который я пробовал, и он работает нормально.

db.students.find({},{"_id":0,"name":1}).sort({"mark":-1})

Моя MongoDB версия: v4.2.8 . Теперь вопрос в том, что эквивалентно Aggregation Query приведенному выше запросу. Я попробовал выполнить два запроса. Но оба не дали желаемого результата.

db.students.aggregate([{"$project":{"name":1,"_id":0}},{"$sort":{"mark":-1}}])

db.students.aggregate([{"$project":{"name":1,"_id":0,"mark":1}},{"$sort":{"mark":-1}}])

1 Ответ

0 голосов
/ 03 августа 2020

Почему он работает в find()?

Согласно Cursor.Sort , когда набор результатов одновременно сортируется и проецируется, механизм запросов MongoDB всегда будет применять сортировку сначала.

Почему он не работает в aggregate()?

Согласно конвейер агрегации конвейер агрегации MongoDB состоит из этапов. На каждом этапе документы преобразуются по мере их прохождения по конвейеру. Этапы конвейера не требуют создания одного выходного документа для каждого входного документа; например, на некоторых этапах могут быть созданы новые документы или отфильтрованы документы.

Необходимо исправить:

Вам следует изменить порядок конвейера, потому что, если вы не выбрали mark в $project, то оно больше не будет доступно в других конвейерах и не повлияет на работу $sort.

db.students.aggregate([
    { "$sort": { "mark": -1 } },
    { "$project": { "name": 1, "_id": 0 } }
])

Площадка: https://mongoplayground.net/p/xtgGl8AReeH

...