J'ai parcouru plusieurs articles et exemples, mais je n'ai pas encore trouvé de moyen efficace d'effectuer cette requête SQL dans MongoDB (où il y a des millions d'enregistrements). rangées documents)
Première tentative
(par exemple, à partir de cette question qui fait presque double emploi). L'équivalent Mongo de SELECT DISTINCT de SQL ? )
db.myCollection.distinct("myIndexedNonUniqueField").length
J'ai évidemment obtenu cette erreur car mon jeu de données est énorme.
Thu Aug 02 12:55:24 uncaught exception: distinct failed: {
"errmsg" : "exception: distinct too big, 16mb cap",
"code" : 10044,
"ok" : 0
}
Deuxième tentative
J'ai décidé d'essayer de faire un groupe
db.myCollection.group({key: {myIndexedNonUniqueField: 1},
initial: {count: 0},
reduce: function (obj, prev) { prev.count++;} } );
Mais j'ai eu ce message d'erreur à la place :
exception: group() can't handle more than 20000 unique keys
Troisième tentative
Je n'ai pas encore essayé mais il y a plusieurs suggestions qui impliquent mapReduce
par exemple
- celui-ci comment faire distinct et groupe dans mongodb ? (non accepté, l'auteur de la réponse / OP ne l'a pas testé)
- celui-ci Groupe MongoDB par fonctionnalités (semble similaire à Second Attempt)
- celui-ci http://blog.emmettshear.com/post/2010/02/12/Counting-Uniques-With-MongoDB
- celui-ci https://groups.google.com/forum/?fromgroups#!topic/mongodb-user/trDn3jJjqtE
- celui-ci http://cookbook.mongodb.org/patterns/unique_items_map_reduce/
Aussi
Il semble qu'il y ait une demande de modification sur GitHub qui corrige le problème. .distinct
pour mentionner qu'il ne devrait retourner qu'un compte, mais c'est toujours ouvert : https://github.com/mongodb/mongo/pull/34
Mais à ce stade, j'ai pensé qu'il valait la peine de demander ici, quelles sont les dernières nouvelles sur le sujet ? Dois-je passer à SQL ou à une autre base de données NoSQL pour les comptes distincts ? ou existe-t-il un moyen efficace ?
Mise à jour :
Ce commentaire sur la documentation officielle de MongoDB n'est pas encourageant, est-ce exact ?
http://www.mongodb.org/display/DOCS/Aggregation#comment-430445808
Mise à jour2 :
Il semble que le nouveau Aggregation Framework réponde au commentaire ci-dessus... (MongoDB 2.1/2.2 et supérieur, aperçu de développement disponible, pas pour la production)