我需要按 $hour 字段进行分组,以便我可以匹配查询中的特定时间,但最终结果我不希望输出中包含 _id.hour 。我尝试添加第二个分组依据,但结果仍然显示同一关键字 ID 的多个记录,因为它返回基于第一个分组依据的结果,该结果在结果中包含多个小时。
db.getCollection("yahoohourlyquick").aggregate([{
"$match": {
"pid" : {"$in" : [759]},
"date": {"$gte": new ISODate('2024-03-29')},
"clicks": {"$gt": 0},
"graphdata": {"$regex": "^rs-"},
},
},
{
"$group": {
"_id": {
"date": {"$hour" : "$date"},
"pid": "$pid",
"keywordid": "$graphdata",
},
"rpc": {"$avg": "$cpc"},
"clicks" : {"$sum" : "$clicks"},
},
},
{
"$match" : {
"_id.date" : {$in:[1,2,3]},
"clicks" : {"$gte" : 10}
}
},
{
"$group": {
"_id": {
"pid": "$pid",
"keywordid": "$graphdata",
},
"data" : {$push: {
"clicks" : "$clicks",
"rpc" : "$rpc",
"keywordid" : "$_id.keywordid",
"pid" : "$_id.pid"
}}
},
},
{$unwind : "$data"},
{
"$project": {
_id : 0,
"pid" : "$data.pid",
"keywordid" : "$data.keywordid",
"clicks" : "$data.clicks",
"rpc" : "$data.rpc"
},
},
{
"$sort" : {"rpc":-1}
}
])
我的目标是让输出包含 PID、关键字 ID、点击次数总和、平均 RPCS。不应该有具有相同keywordid的行,但我似乎无法解决这个问题。
您可以看到关键字“rs-2391021771”在那里出现两次,因为它有多个小时的数据。我不想在结果中细分每个小时。
我终于成功了。
db.getCollection("yahoohourlyquick").aggregate([{
"$match": {
"pid" : {"$in" : [759]},
"date": {"$gte": new ISODate('2024-03-29')},
"clicks": {"$gt": 0},
"graphdata": {"$regex": "^rs-"},
},
},
{
"$project": {
"hour": {"$hour" : "$date"},
"pid" : "$pid",
"keywordid" : "$graphdata",
"rpc" : "$cpc",
"clicks" : "$clicks"
},
},
{
"$match" : {
"hour" : {$in:[23,0,1]},
}
},
{
"$group": {
"_id": {
"pid": "$pid",
"keywordid": "$keywordid",
},
"rpc": {"$avg": "$rpc"},
"clicks" : {"$sum" : "$clicks"},
},
},
{
"$match" : {
"clicks" : {"$gte" : 10}
}
},
{
"$project": {
"pid" : "$_id.pid",
"keywordid" : "$_id.keywordid",
"rpc" : "$rpc",
"clicks" : "$clicks"
},
},
{
"$sort" : {"rpc":-1}
}
])