我用谷歌搜索了很多,但没有找到任何有用的解决方案……我想找到每日用户的总数.
我有一个名为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 ])