MongoDB——aggregate聚合优化技巧

更新时间:2023-07-06 11:15:07 阅读: 评论:0

MongoDB——aggregate聚合优化技巧
此⽂章简要介绍MongoDB聚合的技巧,第⼆条的技巧思路也可以适⽤于MapReduce统计过程。
按天统计数据
props
{"$project" : { "newTime" : {"$add" : ["$originalTime" , 1000 * 60 * 60 * 8] } , "newAccountTime" : 1, "otherField" : 1} },
{"$group" : {
"_id" : {
零基础英语学习"year" : {"$year" : "$newTime" }, "month" : {"$month" : "$newTime"} , "day" : {"$dayOfMonth" : "$newTime"} ,
kisi
"timeStr" : {"$substr" : ["$newTime", 0, 10 ] } , "otherField" : "$otherField"
}
}
},
// ....
{"$sort" : {"year" : 1, "month" : 1, "day" : 1}}
])
将按不同的key聚合语句,合并为⼀条
其思路也可以⽤到MapReduce处理流程。
在某些情况下,需要统计每个⽐赛模式的玩家综合数据,也需要统计每个玩家在不同⽐赛模式的数据。
例如,有”排位模式“、”⼤乱⽃模式“、”休闲模式“等。需要统计各个游戏模式下,玩家参与数、胜率等数据。这样统计需要以gameId作为聚合的key。
同时,也需要统计各个玩家在不同“排位模式”、“休闲模式”的参与次数、胜率等。这样统计需要以玩家
的urId作为聚合的key。
解决思路:
buceros1. 按gameId和urId进⾏group。
2. 对上⼀步的gameId进⾏group,同时将urId push 到数组⾥⾯。这样就得到第⼀个要求的数据,且将玩家的信息保存下来了。
3. 对上⼀步的数组⽤unwind进⾏拆分
4. 对上⼀步的拆分结果的urId进⾏group。这样每个urId聚合的结果也带了游戏模式的统计结果。
5. 进⾏过滤处理。
经测试,这样只读取了⼀次数据库,中间过程对内存的要求⽐较⾼,需要开启allowDiskU选项,⼀次聚合⽐两次聚合效率⾼很多。
参考代码:
llection("grandLog").aggregate([
// ....
{"$group" : {"_id" :{"gameId" : "$gameId", "urId" : "$urId"} , "otherField" : "$otherField" } },
{"$group" : {
"_id" : "$_id.gameId", "urCount" : {"$sum" : 1} ,
"urInfo" : {"$push" : {"urId" : "$_id.urId" ,"otherField" : "$otherField"} }
世风
}
},
{"$unwind" : "$urInfo"},
translational{"$group" : {"_id" :"$urInfo.urId", "gameId" : {"$push" : "$_id"},
施工现场安全管理"urCount" : {"$push" : "$urCount" } }
}
]
英语专业八级考试, {"allowDiskU" : true } );
北京艺术培训
也可以根据业务数据将group的两个步骤颠倒。

本文发布于:2023-07-06 11:15:07,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/78/1081655.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:聚合   模式   统计   需要
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图