SQL Server e 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?
(Observação: esta é uma repostagem da pergunta do MongoDB aqui . Espero obter mais feedback dos DBAs...)
O MongoDB não tem nenhum conceito de classificação. O mais próximo que encontrei 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.
Depois de algumas experiências, descobri que é possível construir uma função de classificação com base no MapReduce, assumindo que o conjunto de resultados pode caber no tamanho máximo do documento.
Por exemplo, suponha que eu tenha uma coleção como esta:
Posso executar o equivalente aproximado de um DENSE_RANK assim:
Para comparação, aqui está a abordagem "ingênua" mencionada em outro lugar:
Eu comparei ambas as 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 o surpreendeu para tamanhos de coleção maiores, especialmente depois que o cache foi aquecido:
Então, por enquanto, parece que a abordagem ingênua é o caminho a percorrer, embora eu esteja interessado em ver se a história muda ainda este ano, à medida que a equipe do MongoDB continua melhorando o desempenho do MapReduce.