2014-04-25 8 views
4

Je sauverai tweets mongo DB:groupe MongoDB par heure

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

Il est OK.

L'heure du tweet dans MongoDB est au format: 2014-04-25 11:45:14 GMT (column created_at) Maintenant, j'ai besoin de la colonne group created_at en heures. Je voudrais avoir le résultat:

heure | compter les tweets en heure


1 | 28

2 | 26

3 | 32

4 | 42

5 | 36

...

Ma tentative infructueuse:

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

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

Mais mon pas en mesure de groupe par heure.

Comment le faire?

+0

Pouvez-vous nous montrer un exemple de document que vous avez? – Sammaye

Répondre

9

Je pourrais vous dire comment vous groupez pouvez en utilisant le framework d'agrégation directement sur la console mongo

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

Pour plus d'options que vous pouvez regarder ici: http://docs.mongodb.org/manual/reference/operator/aggregation-date/

Vous aurez également besoin de trouver de manière appropriée de l'utilisation cadre d'agrégation de n'importe quel langage de programmation que vous utilisez.

3

Il ne devrait pas être nécessaire d'utiliser une étape $project ici peuvent simplement utiliser les fonctions date operator directement à l'étape $group lors de la définition du groupement _id. Cela évite d'avoir à traiter toute la collection afin d'obtenir le résultat:

Aussi, vous êtes juste compter, si simplement { "$sum" : 1 }, dans lequel la définition d'un champ qui n'existait pas était le problème entraînant 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), 
      ), 
     ) 
    )); 

Si quoi que ce soit, ajoutez une étape $match au début du pipeline afin de filtrer la date. Si un jour est acceptable pour la sortie, il vous suffit de définir le $hour dans le groupe et vous réduisez la taille de l'ensemble de travail, ce qui signifie plus rapide. Et probablement ce que tu veux faire de toute façon.