You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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聚合管道处理数组内的最大值提取,步骤如下:

  1. $unwind:展开grades数组,将每个数组元素转为独立文档
  2. $sort:按grades.score降序排序,让最高分文档排在最前
  3. $limit:仅保留第一条文档(即对应最高分的记录)
  4. $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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 09:39:22