SQL Server et Oracle ont tous deux des fonctions DENSE_RANK. Existe-t-il un moyen de faire quelque chose de similaire dans MongoDB sans avoir à recourir à MapReduce? En d'autres termes, supposons que vous ayez une clause de sélection T-SQL comme celle-ci:
SELECT DENSE_RANK() OVER(ORDER BY SomeField DESC) SomeRank
Quelle est la meilleure façon de faire la même chose dans MongoDB?
(Remarque: il s'agit d'une rediffusion de la question MongoDB ici . J'espère obtenir plus de commentaires des administrateurs de base de données ...)
sql-server
nosql
mongodb
kgriffs
la source
la source
Réponses:
MongoDB n'a aucun concept de classement. Le plus proche que j'ai pu trouver vient d' ici :
Évidemment, c'est loin d'être idéal. Cependant, MongoDB n'a tout simplement aucun type de fonctionnalité pour cela car il n'est tout simplement pas conçu pour ce type d'interrogation.
la source
Après quelques expérimentations, j'ai trouvé qu'il était possible de construire une fonction de classement basée sur MapReduce, en supposant que l'ensemble de résultats peut tenir dans la taille maximale du document.
Par exemple, supposons que j'ai une collection comme celle-ci:
Je peux effectuer l'équivalent approximatif d'un DENSE_RANK comme ceci:
A titre de comparaison, voici l'approche "naïve" mentionnée ailleurs:
J'ai comparé les deux approches sur une seule instance de MongoDB 1.8.2 en utilisant le code suivant:
Alors que MapReduce était plus rapide que ce à quoi je m'attendais, l'approche naïve l'a fait sortir de l'eau pour des tailles de collection plus importantes, en particulier une fois le cache réchauffé:
Donc pour l'instant, il semble que l'approche naïve soit la voie à suivre, bien que je serai intéressé de voir si l'histoire change plus tard cette année alors que l'équipe MongoDB continue d'améliorer les performances de MapReduce.
la source