加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

基于unix时间戳的Mongodb聚合

发布时间:2020-12-15 18:57:34 所属栏目:安全 来源:网络整理
导读:我用谷歌搜索了很多,但没有找到任何有用的解决方案……我想找到每日用户的总数. 我有一个名为session_log的集合,其中包含以下文档 { "_id" : ObjectId("52c690955d3cdd831504ce30"),"SORTID" : NumberLong(1388744853),"PLAYERID" : 3,"LASTLOGIN" : NumberL
我用谷歌搜索了很多,但没有找到任何有用的解决方案……我想找到每日用户的总数.
我有一个名为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 ])

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读