如何在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
相关产品推荐
相关产品推荐

