MongoDB group by hour
aggregation-framework, javascript, mongodb, php
Solution
I could tell you how you can group using aggregation framework directly on mongo console
db.tweets.aggregate(
{ "$project": {
"y":{"$year":"$created_at"},
"m":{"$month":"$created_at"},
"d":{"$dayOfMonth":"$created_at"},
"h":{"$hour":"$created_at"},
"tweet":1 }
},
{ "$group":{
"_id": { "year":"$y","month":"$m","day":"$d","hour":"$h"},
"total":{ "$sum": "$tweet"}
}
})
For more options you can look here: http://docs.mongodb.org/manual/reference/operator/aggregation-date/
You will also need to find appropriate way of of using aggregation framework from whichever programming language you are using.
Problem
I save tweets to mongo DB: ``` twit.stream('statuses/filter', {'track': ['animal']}, function(stream) { stream.on('data', function(data) { console.log(util.inspect(data)); data.created_at = new Date(data.created_at); collectionAnimal.insert(data, function(err, docs) {}); }); }); ``` It's OK. The tweet time in MongoDB is in format: 2014-04-25 11:45:14 GMT (column created_at) Now I need group column created_at in hours. I would like to have the result: hour | count tweets in hour 1 | 28 2 | 26 3 | 32 4 | 42 5 | 36 ... My unsuccessful attempt: ``` $keys = array('created_at' => true); $initial = array('count' => 0); $reduce = "function(doc, prev) { prev.count += 1 }"; $tweetsGroup = $this->collectionAnimal->group( $keys, $initial, $reduce ); ``` But my not able to group by hour. How to do it?