如何在Mongoose中查询餐厅集合的最高grades.score并返回该分数
查询拥有最高
grades.score的餐厅并返回该分数 Schema定义
const restaurantSchema = new mongoose.Schema({ address: { building: String, coord: [Number, Number], street: String, zipcode: String, }, borough: String, cuisine: String, grades: [{ date: Date, grade: String, score: Number }], name: String, restaurant_id: String, });
需求说明
需要查询出拥有最高grades.score的餐厅,并仅返回该最高分数,期望结果格式如下:
[ { score: 131 } ]
尝试的代码及问题
原代码通过find查询指定返回grades.score字段,按分数降序排序后取第一条,但返回的是完整的grades数组,而非单个最高分数:
Restaurant.find({}, { "grades.score": 1, _id: 0 }).sort({ "grades.score": -1 }).limit(1).exec((err, docs) => { if (err) { console.log(err); } else { console.log(docs); } });
当前返回结果:
[ { grades: [ [Object], [Object], [Object], [Object], [Object], [Object] ] } ]
解决方案
使用MongoDB聚合管道处理数组内的最大值提取,步骤如下:
$unwind:展开grades数组,将每个数组元素转为独立文档$sort:按grades.score降序排序,让最高分文档排在最前$limit:仅保留第一条文档(即对应最高分的记录)$project:仅保留score字段,并将其提升至顶层
代码实现:
Restaurant.aggregate([ { $unwind: "$grades" }, { $sort: { "grades.score": -1 } }, { $limit: 1 }, { $project: { _id: 0, score: "$grades.score" } } ]).exec((err, docs) => { if (err) { console.log(err); } else { console.log(docs); } });
执行后即可得到期望的仅包含最高分数的结果。
内容的提问来源于stack exchange,提问作者Krit
相关产品推荐
相关产品推荐

