SQL Server und Oracle verfügen beide über DENSE_RANK-Funktionen. Gibt es eine Möglichkeit, in MongoDB etwas Ähnliches zu tun, ohne auf MapReduce zurückgreifen zu müssen? Mit anderen Worten, nehmen wir an, Sie haben eine T-SQL-Auswahlklausel wie diese:
SELECT DENSE_RANK() OVER(ORDER BY SomeField DESC) SomeRank
Was ist der beste Weg, um dasselbe in MongoDB zu tun?
(Hinweis: Dies ist ein Repost der MongoDB-Frage hier . Ich hoffe, mehr Feedback von DBAs zu erhalten ...)
sql-server
nosql
mongodb
kgriffs
quelle
quelle
Antworten:
MongoDB hat kein Konzept für ein Ranking. Der nächste, den ich finden konnte, kommt von hier :
Offensichtlich ist dies alles andere als ideal. MongoDB verfügt jedoch einfach über keinerlei Funktionen, da es einfach nicht für diese Art der Abfrage ausgelegt ist.
quelle
Nach einigen Experimenten stellte ich fest, dass es möglich ist, eine Ranglistenfunktion basierend auf MapReduce zu erstellen, vorausgesetzt, die Ergebnismenge passt in die maximale Dokumentgröße.
Angenommen, ich habe eine Sammlung wie diese:
Ich kann das grobe Äquivalent eines DENSE_RANK wie folgt ausführen:
Zum Vergleich ist hier der an anderer Stelle erwähnte "naive" Ansatz:
Ich habe beide Ansätze an einer einzelnen Instanz von MongoDB 1.8.2 mit dem folgenden Code verglichen:
Während MapReduce schneller war als ich erwartet hatte, hat der naive Ansatz es für größere Sammlungsgrößen aus dem Wasser geblasen, insbesondere nachdem der Cache aufgewärmt wurde:
Im Moment sieht es so aus, als ob der naive Ansatz der richtige Weg ist, obwohl ich gespannt sein werde, ob sich die Geschichte später in diesem Jahr ändert, wenn das MongoDB-Team die MapReduce-Leistung weiter verbessert.
quelle