SQL Server и Oracle имеют функции DENSE_RANK. Есть ли способ сделать нечто подобное в MongoDB, не прибегая к MapReduce? Другими словами, предположим, что у вас есть предложение выбора T-SQL, например:
SELECT DENSE_RANK() OVER(ORDER BY SomeField DESC) SomeRank
Каков наилучший способ сделать то же самое в MongoDB?
(Примечание: это репост вопроса MongoDB здесь . Я надеюсь получить больше отзывов от администраторов баз данных ...)
sql-server
nosql
mongodb
kgriffs
источник
источник
Ответы:
MongoDB не имеет никакой концепции ранжирования. Самое близкое, что я смог найти, это отсюда :
Очевидно, это далеко от идеала. Однако MongoDB просто не имеет какой-либо функциональности для этого, поскольку он просто не предназначен для этого типа запросов.
источник
После некоторых экспериментов я обнаружил, что можно построить функцию ранжирования на основе MapReduce, предполагая, что набор результатов может соответствовать максимальному размеру документа.
Например, предположим, у меня есть такая коллекция:
Я могу выполнить грубый эквивалент DENSE_RANK следующим образом:
Для сравнения, вот «наивный» подход, упомянутый в другом месте:
Я протестировал оба подхода на одном экземпляре MongoDB 1.8.2, используя следующий код:
Хотя MapReduce был быстрее, чем я ожидал, наивный подход выкинул его из воды для больших коллекционных размеров, особенно после того, как кеш прогрелся:
Итак, на данный момент похоже, что наивный подход - это путь, хотя мне будет интересно посмотреть, изменится ли история позже в этом году, когда команда MongoDB продолжает улучшать производительность MapReduce.
источник