MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

MongoDB - Classifique os resultados de uma consulta


No MongoDB, você pode classificar os resultados de uma consulta usando o limit() método.

No MongoDB, quando você consulta uma coleção usando o db.collection.find() método, você pode anexar o sort() para especificar como os resultados devem ser classificados. O sort() O método especifica uma ordem de classificação para o cursor.

Ao usar o sort() método, você deve fornecer a ordem de classificação como um parâmetro. Este deve ser um documento JSON que define a ordem de classificação. Ele normalmente conterá um ou mais campos, cada um seguido por 1 ou -1 , dependendo se a classificação deve ser em ordem crescente ou decrescente.

Exemplo


Primeiro vamos fazer uma consulta sem usando sort() (para que possamos ver a ordem de classificação natural):

Sem sort()

db.musicians.find( )

Resultado:
{ "_id" : 1, "name" : "Ian Gillan", "instrument" : "Vocals" }
{ "_id" : 2, "name" : "Ian Paice", "instrument" : "Drums", "born" : 1948 }
{ "_id" : 3, "name" : "Roger Glover", "instrument" : "Bass", "born" : 1945 }
{ "_id" : 4, "name" : "Steve Morse", "instrument" : "Guitar", "born" : 1954 }
{ "_id" : 5, "name" : "Don Airey", "instrument" : "Keyboards", "born" : 1948 }
{ "_id" : 6, "name" : "Jeff Martin", "instrument" : "Vocals", "born" : 1969 }
{ "_id" : 7, "name" : "Jeff Burrows", "instrument" : "Drums", "born" : 1968 }
{ "_id" : 8, "name" : "Stuart Chatwood", "instrument" : "Bass", "born" : 1969 }

Com sort() em ordem crescente


Um valor de 1 ao lado de um nome de campo especifica que os documentos devem ser classificados pelo campo especificado em ordem crescente.

Aqui, classificamos os resultados por nome em ordem crescente:
db.musicians.find( ).sort( { name: 1 } )

Resultado:
{ "_id" : 5, "name" : "Don Airey", "instrument" : "Keyboards", "born" : 1948 }
{ "_id" : 1, "name" : "Ian Gillan", "instrument" : "Vocals" }
{ "_id" : 2, "name" : "Ian Paice", "instrument" : "Drums", "born" : 1948 }
{ "_id" : 7, "name" : "Jeff Burrows", "instrument" : "Drums", "born" : 1968 }
{ "_id" : 6, "name" : "Jeff Martin", "instrument" : "Vocals", "born" : 1969 }
{ "_id" : 3, "name" : "Roger Glover", "instrument" : "Bass", "born" : 1945 }
{ "_id" : 4, "name" : "Steve Morse", "instrument" : "Guitar", "born" : 1954 }
{ "_id" : 8, "name" : "Stuart Chatwood", "instrument" : "Bass", "born" : 1969 }

Com sort() em ordem decrescente


Um valor de -1 ao lado de um nome de campo especifica a ordem decrescente.

Aqui, classificamos os resultados por nome em ordem decrescente:
db.musicians.find( ).sort( { name: -1 } )

Resultado:
{ "_id" : 8, "name" : "Stuart Chatwood", "instrument" : "Bass", "born" : 1969 }
{ "_id" : 4, "name" : "Steve Morse", "instrument" : "Guitar", "born" : 1954 }
{ "_id" : 3, "name" : "Roger Glover", "instrument" : "Bass", "born" : 1945 }
{ "_id" : 6, "name" : "Jeff Martin", "instrument" : "Vocals", "born" : 1969 }
{ "_id" : 7, "name" : "Jeff Burrows", "instrument" : "Drums", "born" : 1968 }
{ "_id" : 2, "name" : "Ian Paice", "instrument" : "Drums", "born" : 1948 }
{ "_id" : 1, "name" : "Ian Gillan", "instrument" : "Vocals" }
{ "_id" : 5, "name" : "Don Airey", "instrument" : "Keyboards", "born" : 1948 }

Vários campos


Você pode classificar por vários campos. Basta separar cada campo por uma vírgula. Ao fazer isso, os documentos serão classificados pelo primeiro campo especificado, depois pelo próximo e assim por diante.

Aqui, classificamos pelo instrumento campo, seguido pelo born campo. Se dois ou mais músicos tocarem o mesmo instrumento, o nascido campo determina como eles são ordenados um em relação ao outro.
db.musicians.find( ).sort( { instrument: 1, born: 1 } )

Resultado:
{ "_id" : 3, "name" : "Roger Glover", "instrument" : "Bass", "born" : 1945 }
{ "_id" : 8, "name" : "Stuart Chatwood", "instrument" : "Bass", "born" : 1969 }
{ "_id" : 2, "name" : "Ian Paice", "instrument" : "Drums", "born" : 1948 }
{ "_id" : 7, "name" : "Jeff Burrows", "instrument" : "Drums", "born" : 1968 }
{ "_id" : 4, "name" : "Steve Morse", "instrument" : "Guitar", "born" : 1954 }
{ "_id" : 5, "name" : "Don Airey", "instrument" : "Keyboards", "born" : 1948 }
{ "_id" : 1, "name" : "Ian Gillan", "instrument" : "Vocals" }
{ "_id" : 6, "name" : "Jeff Martin", "instrument" : "Vocals", "born" : 1969 }

E só para ver como o segundo campo pode afetar a ordem, mude para um valor negativo (decrescente):
db.musicians.find( ).sort( { instrument: 1, born: -1 } )

Resultado:
{ "_id" : 8, "name" : "Stuart Chatwood", "instrument" : "Bass", "born" : 1969 }
{ "_id" : 3, "name" : "Roger Glover", "instrument" : "Bass", "born" : 1945 }
{ "_id" : 7, "name" : "Jeff Burrows", "instrument" : "Drums", "born" : 1968 }
{ "_id" : 2, "name" : "Ian Paice", "instrument" : "Drums", "born" : 1948 }
{ "_id" : 4, "name" : "Steve Morse", "instrument" : "Guitar", "born" : 1954 }
{ "_id" : 5, "name" : "Don Airey", "instrument" : "Keyboards", "born" : 1948 }
{ "_id" : 6, "name" : "Jeff Martin", "instrument" : "Vocals", "born" : 1969 }
{ "_id" : 1, "name" : "Ian Gillan", "instrument" : "Vocals" }

Classificar com limite


Você pode usar sort() com limit() para classificar os resultados do conjunto de resultados limitado.

Aqui limitamos os resultados a 3 documentos:
db.musicians.find( ).limit(3).sort( { name: 1, born: -1 } )

Resultado:
{ "_id" : 5, "name" : "Don Airey", "instrument" : "Keyboards", "born" : 1948 }
{ "_id" : 1, "name" : "Ian Gillan", "instrument" : "Vocals" }
{ "_id" : 2, "name" : "Ian Paice", "instrument" : "Drums", "born" : 1948 }

Se mudarmos nome para ordem decrescente:
db.musicians.find( ).limit(3).sort( { name: -1, born: -1 } )

Resultado:
{ "_id" : 8, "name" : "Stuart Chatwood", "instrument" : "Bass", "born" : 1969 }
{ "_id" : 4, "name" : "Steve Morse", "instrument" : "Guitar", "born" : 1954 }
{ "_id" : 3, "name" : "Roger Glover", "instrument" : "Bass", "born" : 1945 }

Observe que, neste caso, born não tem efeito, pois nunca há mais de um resultado para um determinado nome.

Comparação de diferentes tipos


Ao comparar valores de diferentes tipos de BSON, o MongoDB usa a seguinte ordem de comparação, do menor para o maior:
  1. MinKey (tipo interno)
  2. Nulo
  3. Números (ints, longs, doubles)
  4. Símbolo, string
  5. Objeto
  6. Matriz
  7. BinData
  8. ObjectID
  9. Booleano
  10. Data
  11. Carimbo de data e hora
  12. Expressão regular
  13. MaxKey (tipo interno)

Observe que os campos inexistentes são tratados da mesma forma que um valor nulo (ou objeto BSON vazio).