我用谷歌搜索了很多,但没有找到任何有用的解决方案……我想找到每日用户的总数.
我有一个名为session_log的集合,其中包含以下文档
我有一个名为session_log的集合,其中包含以下文档
- {
- "_id" : ObjectId("52c690955d3cdd831504ce30"),"SORTID" : NumberLong(1388744853),"PLAYERID" : 3,"LASTLOGIN" : NumberLong(1388744461),"ISLOGIN" : 1,"logoUT" : NumberLong(1388744853)
- }
我想从LASTLOGIN汇总…
这是我的查询:
- db.session_log.aggregate(
- { $group : {
- _id: {
- LASTLOGIN : "$LASTLOGIN"
- },count: { $sum: 1 }
- }}
- );
但它是按每个登录时间聚合,而不是每天.任何帮助,将不胜感激
MongoDB 3.0及更新版本:
- db.session_log.aggregate([
- {
- "$group": {
- "_id": {
- "$dateToString": {
- "format": "%Y-%m-%d","date": {
- "$add": [
- new Date(0),{ "$multiply": [1000,"$LASTLOGIN"] }
- ]
- }
- }
- },"count": { "$sum": 1 }
- }
- }
- ])
您需要通过将值乘以1000将LASTLOGIN字段转换为毫秒时间戳
- { "$multiply": [1000,"$LASTLOGIN"] }
,然后转换为日期
- "$add": [
- new Date(0),"$LASTLOGIN"] }
- ]
这可以在$project
管道中完成,方法是将您的毫秒时间添加到零毫秒Date(0)对象,然后从转换后的日期中提取$year
,$month
,$dayOfMonth
个零件,然后您可以在$group
管道中使用这些零件对文档进行分组到了白天.
因此,您应该将聚合管道更改为:
- var project = {
- "$project":{
- "_id": 0,"y": {
- "$year": {
- "$add": [
- new Date(0),"$LASTLOGIN"] }
- ]
- }
- },"m": {
- "$month": {
- "$add": [
- new Date(0),"d": {
- "$dayOfMonth": {
- "$add": [
- new Date(0),"$LASTLOGIN"] }
- ]
- }
- }
- }
- },group = {
- "$group": {
- "_id": {
- "year": "$y","month": "$m","day": "$d"
- },"count" : { "$sum" : 1 }
- }
- };
运行聚合管道:
- db.session_log.aggregate([ project,group ])
会给出以下结果(基于样本文件):
- { "_id" : { "year" : 2014,"month" : 1,"day" : 3 },"count" : 1 }
改进将是在单个管道中运行上述内容
- var group = {
- "$group": {
- "_id": {
- "year": {
- "$year": {
- "$add": [
- new Date(0),"$LASTLOGIN"] }
- ]
- }
- },"mmonth": {
- "$month": {
- "$add": [
- new Date(0),"day": {
- "$dayOfMonth": {
- "$add": [
- new Date(0),"$LASTLOGIN"] }
- ]
- }
- }
- },"count" : { "$sum" : 1 }
- }
- };
运行聚合管道:
- db.session_log.aggregate([ group ])