2014-04-25 48 views
4

我保存鳴叫蒙戈DB:MongoDB的組按小時

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) {}); 
    }); 
}); 

這是確定的。

MongoDB中的推文時間格式爲:2014-04-25 11:45:14 GMT(column created_at) 現在我需要在幾小時內創建組列create_at。我想得到結果:

小時|在小時內計算推文


1 | 28

2 | 26

3 | 32

4 | 42

5 | 36

...

我不成功的嘗試:

$keys = array('created_at' => true); 
    $initial = array('count' => 0); 
    $reduce = "function(doc, prev) { prev.count += 1 }"; 

    $tweetsGroup = $this->collectionAnimal->group($keys, $initial, $reduce); 

但是我沒有時間能集團。

怎麼辦? http://docs.mongodb.org/manual/reference/operator/aggregation-date/

你也需要找到使用適當的方法:

+0

你能告訴我們你有一個示例文件嗎? – Sammaye

回答

9

如何能集團直接使用聚合框架蒙戈控制檯

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"} 
    } 
}) 

上更多的選擇,你可以看看這裏我可以告訴你彙總框架從您使用的任何編程語言。

3

應該不需要使用$project階段,因爲在定義分組_id時,date operator函數可以直接用於$group階段。這節省了處理整個集合才能得到結果:

你也只是計數,所以乾脆{ "$sum" : 1 },其中界定不存在是導致0

$this->collection->aggregate(array(
     array(
      '$group' => array(
       "_id" => array( 
        "y" => array('$year' => '$created_at'), 
        "m" => array('$month' => '$created_at'), 
        "d" => array('$dayOfMonth' => '$created_at'), 
        "h" => array('$hour' => '$created_at'), 
       ), 
       "total" => array('$sum' => 1), 
      ), 
     ) 
    )); 
問題的一個領域

如果有任何問題,請在流水線開始處添加一個$match階段以過濾日期。如果有一天可以接受輸出,那麼您只需要在分組中定義$hour,並且您正在縮小工作集大小,這意味着更快。可能無論如何你想做的事。