MongoDB排序:等价聚合查询



我有以下学生收集

{ "_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


最新更新