O SQL Server e o Oracle têm funções DENSE_RANK. Existe uma maneira de fazer algo semelhante no MongoDB sem precisar recorrer ao MapReduce? Em outras palavras, suponha que você tenha uma cláusula de seleção T-SQL como esta:
SELECT DENSE_RANK() OVER(ORDER BY SomeField DESC) SomeRank
Qual é a melhor maneira de fazer a mesma coisa no MongoDB?
(Nota: esta é uma repostagem da pergunta do MongoDB por aqui . Espero obter mais feedback dos DBAs ...)
sql-server
nosql
mongodb
kgriffs
fonte
fonte
Respostas:
MongoDB não tem nenhum conceito de classificação. O mais próximo que pude encontrar vem daqui :
Obviamente, isso está longe de ser o ideal. No entanto, o MongoDB simplesmente não possui nenhum tipo de funcionalidade para isso, pois simplesmente não foi projetado para esse tipo de consulta.
fonte
Após algumas experiências, descobri que é possível criar uma função de classificação com base no MapReduce, assumindo que o conjunto de resultados possa caber no tamanho máximo do documento.
Por exemplo, suponha que eu tenha uma coleção como esta:
Eu posso executar o equivalente aproximado de um DENSE_RANK da seguinte forma:
Para comparação, aqui está a abordagem "ingênua" mencionada em outro lugar:
Comparei as duas abordagens em uma única instância do MongoDB 1.8.2 usando o seguinte código:
Embora o MapReduce tenha sido mais rápido do que eu esperava, a abordagem ingênua expulsou-a da água para tamanhos de coleta maiores, especialmente depois que o cache foi aquecido:
Portanto, por enquanto, parece que a abordagem ingênua é o caminho a seguir, embora eu esteja interessado em ver se a história muda ainda este ano, pois a equipe do MongoDB continua melhorando o desempenho do MapReduce.
fonte