MongoDB聚合查询问题:移除hour分组字段并合并重复keywordid
解决MongoDB聚合查询中重复keywordid的问题
问题核心是你在第二次分组时错误引用了不存在的字段,且多余的$push和$unwind操作导致重复条目。以下是修正后的聚合代码,直接实现按特定时段筛选后,合并同一keywordid的总点击量与平均RPC,且无重复条目的需求:
db.getCollection("yahoohourlyquick").aggregate([ // 1. 基础条件筛选 { "$match": { "pid": {"$in": [759]}, "date": {"$gte": new ISODate('2024-03-29')}, "clicks": {"$gt": 0}, "graphdata": {"$regex": "^rs-"} } }, // 2. 按小时、PID、keywordid分组,计算每小时的点击量总和与RPC平均值 { "$group": { "_id": { "hour": {"$hour": "$date"}, "pid": "$pid", "keywordid": "$graphdata" }, "hourly_clicks": {"$sum": "$clicks"}, "hourly_rpc": {"$avg": "$cpc"} } }, // 3. 筛选目标时段(1/2/3点)且该小时点击量≥10的记录 { "$match": { "_id.hour": {"$in": [1,2,3]}, "hourly_clicks": {"$gte": 10} } }, // 4. 按PID、keywordid合并,计算总点击量与平均RPC { "$group": { "_id": { "pid": "$_id.pid", "keywordid": "$_id.keywordid" }, "total_clicks": {"$sum": "$hourly_clicks"}, "avg_rpc": {"$avg": "$hourly_rpc"} } }, // 5. 格式化输出,去掉_id字段 { "$project": { "_id": 0, "pid": "$_id.pid", "keywordid": "$_id.keywordid", "clicks": "$total_clicks", "rpc": "$avg_rpc" } }, // 6. 按RPC降序排序 { "$sort": {"rpc": -1} } ])
关键修改说明:
- 第二次分组时,直接引用第一次分组输出的
$_id.pid和$_id.keywordid(原代码错误使用了已不存在的$graphdata字段) - 删除多余的
$push和$unwind操作,通过第二次分组直接聚合得到每个keywordid的唯一条目 - 重命名中间计算字段(如
hourly_clicks),避免与最终总点击量混淆
内容的提问来源于stack exchange,提问作者Jeff Shoemaker
相关产品推荐
相关产品推荐

