2011-05-27 1 views
4

J'utilise l'API Twitter en temps réel pour garder un compte actif de certaines pistes. Par exemple, je veux garder une trace du nombre de fois que 'apple', 'orange' et 'pear' sont tweeté. J'utilise Mongo pour stocker les données du tweet, mais j'ai une question sur la meilleure façon d'obtenir le compte pour chacune des pistes que je suis.MongoDB - Consommer les Tweets et compter les données

Je vais courir cette requête une fois par seconde pour obtenir un compte près de en temps réel pour chaque piste, donc je dois me assurer que je fais dans le droit chemin:

Option 1

exécuter un comptage requête sur une piste particulière

db.tweets.count({track: 'apple'}) 

Compte tenu de la base de données tweet contiendra beaucoup de données (potentiellement des millions) Je me demande si cela pourrait être un peu lent?

Option 2

Créer une deuxième collection, 'track_count' et mettre à jour un 'count' attribuer à chaque fois qu'un nouveau tweet est disponible en:

{track:'apple', count:0} 
{track:'orange', count:0} 
{track:'pear', count:0} 

Puis, quand vient un nouveau tweet dans:

db.track_count.update({ track:"apple" }, { $inc: { count : 1 } }); 

Je peux alors garder un à jour comptage pour chaque piste, mais cela signifie que l'écriture à la base de données deux fois, une fois pour le tweet et encore une fois pour incrémenter le nombre de pistes. En gardant à l'esprit qu'il pourrait y avoir un nombre équitable (dizaines, peut-être des centaines) de tweets arrivant par seconde.

Quelqu'un at-il des suggestions quant à la meilleure méthode pour ce faire?

+0

Je me demandais ce que tu as fait à la fin? Deuxième collection pour les incréments ou peut-être en mémoire opérationnelle comme Redis? – Maziyar

Répondre

3

Sans aucun doute, utilisez une collection distincte track_count pour conserver le nombre cumulé de correspondances. Sinon, vous réinterrogerez toute votre collection tweets toutes les secondes, ce qui deviendra très lent et coûteux au fur et à mesure que le volume de données augmentera.

Ne vous inquiétez pas d'écrire dans la base de données deux fois, une fois pour stocker le tweet, puis de nouveau pour incrémenter le compteur. Les écritures dans MongoDB sont extrêmement rapides, et cette solution évoluera bien au-delà des milliers de tweets par seconde, même sur une seule instance de Mongo non clusterisée.

1

Quelqu'un a-t-il des suggestions quant à la meilleure méthode pour cela?

Il n'y a pas de "meilleure" méthode ici. C'est un compromis classique. Vous pouvez faire des "compteurs", vous pouvez souffrir de requêtes lentes, vous pouvez exécuter des tâches de réduction de mappage régulières.

  • Deux écritures => plus rapide des requêtes, activité plus d'écriture
  • Une écriture => requêtes plus lentes, moins d'activité d'écriture
  • horaire M/R => données légèrement défraîchie, un peu plus écrit

Typiquement, la suggestion est d'utiliser les compteurs. MongoDB a tendance à être assez bon pour gérer de grandes charges d'écriture, en particulier ce type d'incrément ou de charge de compteurs.

Vous n'obtenez pas plus de vitesse à moins de sacrifier quelque chose. Disque, RAM, CPU. Vous devrez donc choisir votre compromis en fonction de vos besoins.


Side note: est le nom de la piste unique?

Vous pouvez essayer ce qui suit:

{_id:'orange', count:0} 
{_id:'pear', count:0} 

Ou pour le comptage par jour:

{_id:'orange_20110528', count:0} 
{_id:'orange_20110529', count:0} 
{_id:'pear_20110529', count:0} 
+0

quel est l'avantage de le faire en utilisant un numéro d'identification standard? – Hanpan

+0

Si vous ne remplissez pas le champ '_id', MongoDB fournit un ObjectId généré automatiquement. Le champ '_id' est automatiquement indexé. Si vous remplacez ce champ par un élément unique, vous pouvez généralement enregistrer un index. –

Questions connexes