MongoDB group by max 分组查询组内最大的数据,并获取相应的数据

本文深入探讨了如何利用SQL查询与MongoDB的聚合框架,实现复杂数据集的高效处理与分析。通过实例展示了如何从原始数据中提取有价值的信息,提升数据洞察力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//根据一手楼盘id(resblockOneId)分组,获取每组内房价最高(totalprBegin)的一手房源id(houseOne1Id)db.mhouseonedetail.group({'key':{'resblockOneId':1},'$reduce':function(doc,prev){ var junjia = (doc.totalprBegin+doc.totalprEnd)/2 ; if(junjia > prev.totalprBegin) { prev.totalprBegin= junjia; prev.resblockOneId =doc.resblockOneId ; prev.houseOne1Id = doc.houseOneId; }}, 'initial':{'totalprBegin':1,'resblockOneId':'0','houseOne1Id':'0'}})

-----------------等同于SQL---------------------

select *
  from salesmgmt.t_hm_house
 where pkid in
  (
        select min(pkid)
          from salesmgmt.t_hm_house house1,
               (select RESBLOCK_ID resblockId, max(PROPERTY_FEE) maxfee
                  from salesmgmt.t_hm_house
                 group by RESBLOCK_ID
                ) house2
         where house1.resblock_id = house2.resblockId
           and house1.PROPERTY_FEE = house2.maxfee
         group by house1.resblock_id, house2.maxfee
   )



MongoDB 中,数据分组聚合主要通过聚合管道(Aggregation Pipeline)实现,尤其是使用 `$group` 阶段来对数据进行分组执行聚合操作。该操作类似于 SQL 中的 `GROUP BY` 语句,但更加灵活和强大,支持多阶段处理。 ### 使用 `$group` 进行数据分组 在聚合管道中,`$group` 阶段用于将文档按照指定字段进行分组在每个内执行聚合操作,如求和、计数、平均值、最大值、最小值等。 基本语法如下: ```javascript db.collection.aggregate([ { $group: { _id: "$groupingField", // 按该字段分组 accumulatorName: { $accumulatorOperator: "$field" } // 聚合操作 } } ]) ``` 例如,假设有一个订单集合 `order`,其中包含字段 `user_id` 和 `order_money`,要按 `user_id` 分组获取每个用户的最后一笔订单金额,可以使用如下聚合语句: ```javascript db.order.aggregate([ { $group: { _id: "$user_id", last_order_money: { $last: "$order_money" } } } ]) ``` 该语句将返回每个用户的最后一笔订单金额,其中 `$last` 是一个聚合操作符,用于获取内最后一个文档的指定字段值[^3]。 ### 常用聚合操作符 以下是一些常用的聚合操作符,可在 `$group` 阶段中使用: - `$sum`:求和 - `$avg`:计算平均值 - `$max`:获取最大值 - `$min`:获取最小值 - `$first`:获取内第一个文档的字段值 - `$last`:获取内最后一个文档的字段值 - `$addToSet`:将字段值添加到数中(去重) - `$push`:将字段值添加到数中(不去重) 例如,计算每个城市的平均年龄: ```javascript db.people.aggregate([ { $group: { _id: "$city", averageAge: { $avg: "$age" } } }, { $sort: { averageAge: -1 } } ]) ``` 此语句首先按城市分组计算平均年龄,然后按平均年龄降序排序[^5]。 ### MapReduce 与聚合管道的对比 虽然 `$group` 和聚合管道是 MongoDB 中最常用的分组聚合方式,但 MongoDB 同样支持 MapReduce 模型。MapReduce 更适合处理大规模数据集,能够在多台服务器上行执行复杂的聚合逻辑。然而,聚合管道在性能上通常优于 MapReduce,尤其是在数据量适中时。此外,MongoDB 对聚合管道的操作有内存限制(单个聚合操作不能超过 20% 的系统内存),而 MapReduce 则没有这一限制[^1]。 ### MapReduce 的基本结构 如果需要使用 MapReduce 进行分组聚合,其基本结构如下: ```javascript db.collection.mapReduce( function() { emit(this.groupingField, this.valueField); }, function(key, values) { return reduceFunction(values); }, { out: "outputCollection" } ) ``` 其中,第一个函数是 `map` 函数,用于生成键值对;第二个函数是 `reduce` 函数,用于合相同键的值;`out` 指定输出结果的集合。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值