2012-02-16 4 views
0

Donc je déplace une partie de mon code de sql à mongodb et il y a peu de choses qui ne me sont pas encore très claires.Quelle est la meilleure approche pour la requête mongodb avec somme et tri

Disons que j'ai la requête SQL simple suivante (juste un exemple)

select count(a.id) as count, b_id 
     from table group by b_id 
     where c_id=[SOME ID] 
     group by b_id 
     order by count desc; 

Je suppose que tout le monde comprend ce que cela fait. Maintenant, avec mongo, je peux utiliser plusieurs approches, tout faire du côté mongo, extraire les résultats sommés et les trier côté client ou simplement obtenir les données brutes du côté client et y faire tout le traitement. Quelle serait la meilleure approche pour la requête ci-dessus, pour tout faire dans la base de données avec un mécanisme interne mongodb (mapreduce etc) ou aller chercher la collection au côté client et la traiter là. L'ensemble de données sera en général énorme, mais la requête peut être divisée en plusieurs parties si nécessaire.

Le client est basé sur Java si cela est important.

Répondre

2

Avec le prochain MongoDB Aggregation Framework, il est assez facile de faire ce que vous devez faire. Il est déjà disponible dans les versions de développement 2.1.x.

Si vous êtes bloqué à la version 2.0 ou antérieure, vous devrez examiner les options que vous mentionnez ou les changements de schéma pour éviter d'avoir à effectuer une agrégation sur place en premier lieu. Par exemple, il est assez courant dans NoSQL de gérer un champ ou un document avec les données agrégées lorsque les données source sont manipulées. L'exemple le plus courant est le maintien de la taille d'un tableau comme un champ:

update({..}, {$push:{array:element}, $inc:{elementCount:1}) 
+0

Je ne suis pas sur la production (encore) pour que je puisse l'utiliser, à votre avis est l'approche cadre d'agrégation toujours plus performant pour le cas au dessus? – mikkom

+0

À l'exception de la gestion manuelle des données agrégées (ce qui est très contextuel) oui. L'AF est complètement natif alors que le groupe et m/r sont alimentés par JavaScript et donc à thread unique et (relativement) lent. Franchement si vous voulez m/r je voudrais intégrer avec Hadoop plutôt que d'utiliser MongoDB m/r –

+0

Merci, je pense que je vais devoir installer la dernière instable alors. – mikkom

1

Vous pouvez grouper des données sur le côté mongo en utilisant Map/Reduce, puis les trier côté client ou côté mongo. Vous pouvez également trouver la carte/réduire l'exemple here.

Questions connexes