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

如何在MongoDB中实现无分组的SQL语句SELECT avg(rate) FROM ratings WHERE sid=1的等效操作

等效的MongoDB操作(无需分组)

嘿,没问题!要实现和SQL SELECT avg(rate) FROM ratings WHERE sid=1 完全等效的MongoDB操作,还不用分组的话,你可以用MongoDB的**窗口函数($setWindowFields)**来实现,它能在不进行显式分组的情况下计算符合条件的所有文档的平均值。

具体代码如下:

db.ratings.aggregate([
  // 对应SQL的WHERE子句,筛选sid=1的文档
  { $match: { sid: 1 } },
  // 计算所有匹配文档的rate平均值,无需显式分组
  { $setWindowFields: {
      output: {
        avgRate: { $avg: "$rate" }
      }
    }
  },
  // 只返回一条结果即可(每个匹配文档都会带上相同的平均值)
  { $limit: 1 },
  // 调整输出格式,只保留平均值字段
  { $project: { avgRate: 1, _id: 0 } }
])

代码细节说明:

  • $match: 和SQL的WHERE sid=1作用完全一致,精准过滤出符合条件的文档。
  • $setWindowFields: 这是核心!我们没有指定分组键(partitionBy),所以默认会把所有匹配的文档当作一个整体计算平均值,全程不需要显式执行分组操作。
  • $limit: 窗口函数会给每个匹配的文档都添加上avgRate字段,我们只需要其中一条结果就够了,用这个步骤减少冗余返回。
  • $project: 用来精简输出内容,只保留我们需要的平均值字段,去掉默认的_id。

版本要求:

这个方法需要MongoDB 5.0及以上版本,因为$setWindowFields是在5.0版本正式引入的窗口函数特性。

内容的提问来源于stack exchange,提问作者ehsan shirzadi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:07:09