sql >> Base de Datos >  >> NoSQL >> MongoDB

MongoDB - Ordenar los resultados de una consulta

En MongoDB, puede ordenar los resultados de una consulta utilizando limit() método.

En MongoDB, cuando consulta una colección usando db.collection.find() método, puede agregar el sort() método para especificar cómo deben ordenarse los resultados. El sort() El método especifica un orden de clasificación para el cursor.

Al usar sort() método, debe proporcionar el criterio de ordenación como parámetro. Debe ser un documento JSON que defina el orden de clasificación. Por lo general, contendrá uno o más campos, cada uno seguido de 1 o -1 , dependiendo de si el orden debe ser ascendente o descendente.

Ejemplo

Primero hagamos una consulta sin usando sort() (para que podamos ver el orden de clasificación natural):

Sin 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 }

Con sort() en orden ascendente

Un valor de 1 junto a un nombre de campo especifica que los documentos deben ordenarse por el campo especificado en orden ascendente.

Aquí ordenamos los resultados por nombre en orden ascendente:

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 }

Con sort() en orden descendente

Un valor de -1 al lado de un nombre de campo especifica el orden descendente.

Aquí ordenamos los resultados por nombre en orden descendente:

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 }

Múltiples campos

Puede ordenar por múltiples campos. Simplemente separe cada campo con una coma. Al hacer esto, los documentos se ordenarán por el primer campo especificado, luego por el siguiente, y así sucesivamente.

Aquí, ordenamos por el instrumento campo, seguido del nacido campo. Si dos o más músicos tocan el mismo instrumento, el nace campo determina cómo ellos se ordenan entre sí.

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 }

Y solo para ver cómo el segundo campo puede afectar el orden, cámbielo a un valor negativo (descendente):

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" }

Ordenar con límite

Puedes usar sort() con limit() para ordenar los resultados del conjunto de resultados limitado.

Aquí limitamos los 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 }

Si cambiamos name en orden descendente:

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 }

Tenga en cuenta que en este caso, born no tiene ningún efecto, ya que nunca hay más de un resultado para un nombre dado.

Comparando diferentes tipos

Al comparar valores de diferentes tipos de BSON, MongoDB utiliza el siguiente orden de comparación, de menor a mayor:

  1. MinKey (tipo interno)
  2. Nulo
  3. Números (ints, largos, dobles)
  4. Símbolo, Cadena
  5. Objeto
  6. matriz
  7. BinData
  8. Id. de objeto
  9. Booleano
  10. Fecha
  11. Marca de tiempo
  12. Expresión regular
  13. MaxKey (tipo interno)

Tenga en cuenta que los campos inexistentes se tratan igual que un valor nulo (o un objeto BSON vacío).