2011-05-19 3 views
7

Je déplace notre système de messagerie vers MongoDB et je suis curieux de savoir quelle approche adopter en ce qui concerne diverses statistiques, comme le nombre de messages par utilisateur, etc. Dans la base de données MS SQL, j'ai une table où j'ai différents comptes par utilisateur et ils sont mis à jour par le déclencheur sur les tables correspondantes, donc je peux par exemple savoir combien de messages non lus UserA a sans appeler une opération coûteuse SELECT Count(*).MongoDB: Calling Count() vs compte le suivi dans une collection

Est-ce que la fonction count dans MongoDB est également chère? J'ai commencé à lire sur map/reduce mais mon site est à charge élevée, donc les statistiques doivent être mises à jour en temps réel, et je crois comprendre que map/reduce prend beaucoup de temps. Quelle serait la meilleure approche (sur le plan du rendement) pour la collecte de divers comptes agrégés dans MongoDB?

Répondre

4

Si vous avez beaucoup de données, alors je bâton avec la même approche et incrémenter un compteur global à chaque fois qu'un nouveau message est ajouté pour un utilisateur, en utilisant une collection de quelque chose comme ceci:

compte

{ 
    userid: 123, 
    messages: 10 
} 

Malheureusement (? ou heureusement) il n'y a pas des déclencheurs dans MongoDB, de sorte que vous voulez incrémenter le compteur de votre logique d'application:

db.counts.update({ userid: 123 }, { $inc: { messages: 1 } }) 

Cela vous donnera les meilleures performances, et vous auriez probablement mis aussi un index sur le champ userid pour les recherches rapides:

db.counts.ensureIndex({ userid: 1 }) 
4

MongoDB bon ajustement pour la denormaliztion de données. Et si votre site est à forte charge, alors vous devez tout pré-calculer, alors utilisez $inc pour incrémenter le nombre de messages, sans aucun doute.