使用mongodb中的UNIX时间戳按小时分组

时间:2016-02-26 11:53:02

标签: mongodb

我需要两天的性别,计数和更新小时输出记录。

db.FaceData.aggregate([ {$match: { 'Timestamp' : { $gte : 1448121600000, $lt : 1448294399000 }, 'DID' : "ABFR001" }},  {$group: { _id: {'Gen': '$Gen'},  count : { $sum : 1 } }}  ]);
output:
 ------
{ "_id" : { "Gen" : 1 }, "count" : 3055 }
{ "_id" : { "Gen" : 0 }, "count" : 2866 }

在上面的输出中,我必须按小时分组两天,例如,每小时我需要性别,计算2天。

时间戳以毫秒为单位。

2 个答案:

答案 0 :(得分:1)

您需要一种机制来从unix时间戳中获取实际日期对象,一种方法是使用将时间戳添加到零毫秒 Date() 对象实际分组聚合管道之前 $add 阶段的$project 运算符。

获得日期后,使用 $hour 运算符提取小时部分,如下所示:

db.FaceData.aggregate([ 
    {
        "$match": { 
            "Timestamp" : { $gte : 1448121600000, $lt : 1448294399000 }, 
            "DID" : "ABFR001" 
        }
    },
    {
        $project : {
            "hourPart" : {
                "$hour": { "$add": [ new Date(0), "$Timestamp" ] }
            },
            "Gen": 1
        }
    },  
    {
        "$group": { 
            "_id": "$hourPart",  
            "Gen_0_count" : {
                "$sum": {
                    "$cond": [ { "$eq": [ "$Gen", 0 ] }, 1, 0 ]
                }
            },
            "Gen_1_count" : {
                "$sum": {
                    "$cond": [ { "$eq": [ "$Gen", 1 ] }, 1, 0 ]
                }
            }
        }
    }  
]);

答案 1 :(得分:1)

{"$match": { 
        "Timestamp" : { $gte : 1448121600000, $lt : 1448294399000 }, 
        "DID" : "ABFR001" 
    }} ,
{ "$group" :  {
"_id" : {

    "$divide" : [{ "$subtract" : [{"$divide" : ["$Timestamp", 1000]}, { "$mod" : [{"$divide" : ["$Tstmp", 1000]}, 3600] }] }, 3600 ]
},
"Male" : {
    "$sum": {
        "$cond": [ { "$eq": [ "$Gen", 0 ] }, 1, 0 ]
    }
    },
    "Female" : {
    "$sum": {
        "$cond": [ { "$eq": [ "$Gen", 1 ] }, 1, 0 ]
    }
    }
} }