2016-02-26 161 views
1

我需要两天内输出性别,计数和更新时间的记录。在mongodb中使用UNIX时间戳Group By Hour

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 } 

在上面的输出中,我必须按小时分组两天,例如,每小时我需要Gender,Count为2天。

时间戳以毫秒为单位。

回答

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 ] 
    } 
    } 
} } 
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 ] 
       } 
      } 
     } 
    } 
]); 
+0

感谢chridam,你的代码引导我找到了解决办法,我通过增强使用小时格式的上述代码 –

+0

@SabareeshGunasekaran什么是解决方案?我有同样的问题 – DiegoRBaquero