我有以下学生收集
{ "_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" }
我的要求是根据">标记"字段按降序对集合进行排序。但它不应在最终结果中显示">标记"字段。结果应为:
{ "name" : "Saroj" }
{ "name" : "Rahul" }
{ "name" : "Rajib" }
{ "name" : "Manoj" }
我尝试了以下查询,结果很好。
db.students.find({},{"_id":0,"name":1}).sort({"mark":-1})
我的MongoDB版本是v4.2.8。现在的问题是,上面查询的等效AggregationQuery是什么。我尝试了以下两个问题。但两者都没有给我想要的结果。
db.students.aggregate([{"$project":{"name":1,"_id":0}},{"$sort":{"mark":-1}}])
db.students.aggregate([{"$project":{"name":1,"_id":0,"mark":1}},{"$sort":{"mark":-1}}])
为什么它在find()
中工作
根据光标。排序,当一组结果被排序和投影时,MongoDB查询引擎总是首先应用排序。
为什么它在aggregate()
中不起作用
根据聚合管道,MongoDB聚合管道由多个阶段组成。每个阶段都会在文档通过管道时对其进行转换。管道阶段不需要为每个输入文档生成一个输出文档;例如,一些阶段可以生成新文档或过滤掉文档。
您需要更正:
您应该更改管道顺序,因为如果您没有在$project
中选择mark
字段,那么它将不再在其他管道中可用,也不会影响$sort
的操作。
db.students.aggregate([
{ "$sort": { "mark": -1 } },
{ "$project": { "name": 1, "_id": 0 } }
])
游乐场:https://mongoplayground.net/p/xtgGl8AReeH