Descripción
Ordena los documentos de entrada según uno o más criterios de orden especificados.
Sintaxis
En el siguiente ejemplo, se ordena la colección cities por population en orden ascendente:
Node.js
const results = await db.pipeline()
.collection("/cities")
.sort(Field.of("population").ascending())
.execute();
En el siguiente ejemplo, se ordena la colección cities por el length del nombre de la ciudad, en orden ascendente.
Node.js
const results = await db.pipeline()
.collection("/cities")
.sort(Field.of("name").charLength().ascending())
.execute();
Ejemplos de clientes
Web
const results = await execute(db.pipeline() .collection("books") .sort( field("release_date").descending(), field("author").ascending() ) );
Swift
let results = try await db.pipeline() .collection("books") .sort([ Field("release_date").descending(), Field("author").ascending() ]) .execute()
Kotlin
val results = db.pipeline() .collection("books") .sort( field("release_date").descending(), field("author").ascending() ) .execute()
Java
Task<Pipeline.Snapshot> results = db.pipeline() .collection("books") .sort( field("release_date").descending(), field("author").ascending() ) .execute();
Python
from google.cloud.firestore_v1.pipeline_expressions import Field results = ( client.pipeline() .collection("books") .sort(Field.of("release_date").descending(), Field.of("author").ascending()) .execute() )
Java
Pipeline.Snapshot results = firestore .pipeline() .collection("books") .sort(descending(field("release_date")), ascending(field("author"))) .execute() .get();
Comportamiento
Ordenar por
El orden de clasificación sigue el orden de tipo de valor de Cloud Firestore.
Orden determinístico de los resultados
Si no hay una etapa sort en la consulta, el orden de los resultados devueltos no es determinista y puede variar entre ejecuciones. Si hay una etapa sort, pero las expresiones de ordenamiento no producen un ordenamiento único entre los resultados devueltos, el ordenamiento de los resultados devueltos puede variar entre las ejecuciones.
Por ejemplo, ordenar las ciudades por el country de las ciudades, en orden ascendente, en comparación con el siguiente conjunto de datos
{name: 'Los Angeles', state: 'CA', country: 'USA', population: 3970000},
{name: 'New York', state: 'NY', country: 'USA', population: 8530000}
{name: 'San Francisco', state: 'CA', country: 'USA', population: 870000},
puede producir cualquier permutación de los 3 documentos del conjunto de datos, ya que todos tienen el mismo atributo country. Para generar un orden determinístico de los resultados, puedes agregar un orden de clasificación en name al orden:
Node.js
const results = await db.pipeline()
.collection("/cities")
.sort(Field.of("country").ascending(), Field.of("__name__").ascending())
.execute();
Esto usará el nombre único del documento como desempate cuando varios documentos tengan el mismo valor de country. Ten en cuenta que cualquier otro campo que, junto con el campo country, forme una clave única del documento dentro de la colección se puede usar para generar un orden determinístico de los resultados.
Ordena valores equivalentes
Los valores equivalentes se ordenan juntos, pero el orden de los resultados dentro de la clase equivalente no es determinístico según el orden determinístico de los resultados. Por ejemplo, ordenar las ciudades por size, en orden ascendente, en comparación con el siguiente conjunto de datos
{name: 'Los Angeles', state: 'CA', country: 'USA', size: 3970000},
{name: 'Mexico City', state: null, country: 'Mexico', size: 3970000.0},
puede producir cualquier permutación de los 2 documentos del conjunto de datos, ya que ambos documentos tienen el valor size equivalente 3970000.
Etapas de ordenamiento múltiples
Cuando la búsqueda contiene varias etapas de ordenamiento consecutivas, solo la última etapa de ordenamiento tiene un impacto en los resultados de la búsqueda. Ten en cuenta que esto es diferente del comportamiento de la cláusula orderBy en la API de Core.
Optimización de la clasificación de los N primeros resultados
Cuando se usa un limit después de un sort, se puede usar una clasificación de los primeros N resultados. Esta optimización limita el uso de memoria de la etapa de ordenamiento, ya que solo permite almacenar N documentos a la vez, según lo define limit, lo que hace que el ordenamiento sea más eficiente en cuanto a la memoria.
Valores nulos y ausentes
Si un campo especificado en un ordenamiento no existe en un documento, su valor se ordena como si fuera null.
Por ejemplo, ordenar las ciudades por el state de las ciudades, en orden ascendente, en comparación con el siguiente conjunto de datos
{name: 'Los Angeles', state: 'CA', country: 'USA', population: 3970000},
{name: 'Mexico City', state: null, country: 'Mexico', population: 9200000},
{name: 'New York', state: 'NY', country: 'USA', population: 8530000}
{name: 'San Francisco', state: 'CA', country: 'USA', population: 870000},
{name: 'Toronto', country: 'Canada', population: 2930000},
produce los siguientes resultados, en los que el documento "Toronto" y el documento "Ciudad de México" se ordenan como null y antes que otros documentos.
{name: 'Toronto', country: 'Canada', population: 2930000},
{name: 'Mexico City', state: null, country: 'Mexico', population: 9200000},
{name: 'Los Angeles', state: 'CA', country: 'USA', population: 3970000},
{name: 'San Francisco', state: 'CA', country: 'USA', population: 870000},
{name: 'New York', state: 'NY', country: 'USA', population: 8530000}