Descrizione
Ordina i documenti di input in base a uno o più ordinamenti specificati.
Esempi
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();
Comportamento
Ordinamento
L'ordinamento segue Cloud Firestore l'ordine dei tipi di valori
Ordine deterministico dei risultati
Se nella query non è presente una fase sort, l'ordinamento dei risultati restituiti non è deterministico e può variare tra le esecuzioni. Se è presente una fase sort, ma le espressioni di ordinamento non producono un ordinamento univoco tra i risultati restituiti, l'ordinamento dei risultati restituiti può comunque variare tra le esecuzioni.
Ad esempio, l'ordinamento delle città in base al country delle città, in ordine crescente rispetto al seguente set di dati:
{ 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 },
può produrre qualsiasi permutazione dei 3 documenti nel set di dati perché tutti hanno lo stesso country attributo. Per produrre un ordinamento deterministico dei risultati, puoi aggiungere un ordinamento in base a name all'ordine:
Node.js
const results = await db.pipeline()
.collection("/cities")
.sort(field("country").ascending(), fieldd("__name__").ascending())
.execute();
In questo modo, il nome del documento univoco verrà utilizzato come criterio di spareggio quando più documenti hanno lo stesso country valore. Tieni presente che qualsiasi altro campo che insieme al campo country forma una chiave univoca del documento all'interno della raccolta può essere utilizzato per produrre un ordine deterministico dei risultati.
Ordinamento di valori equivalenti
I valori equivalenti vengono ordinati insieme, ma l'ordine dei risultati all'interno della classe equivalente non è deterministico in base alla discussione sull'ordine deterministico dei risultati. Ad esempio, l'ordinamento delle città in base a size, in ordine crescente rispetto al seguente set di dati:
{ name: "Los Angeles", state: "CA", country: "USA", size: 3970000 },
{ name: "Mexico City", state: null, country: "Mexico", size: 3970000.0 },
può produrre qualsiasi permutazione dei 2 documenti nel set di dati perché entrambi
i documenti hanno il valore equivalente size 3970000.
Più fasi di ordinamento
Quando la query contiene più fasi di ordinamento consecutive, solo l'ultima fase di ordinamento ha un impatto sui risultati della query. Tieni presente che questo comportamento è diverso da quello della clausola orderBy nell'API Core.
Ottimizzazione dell'ordinamento Top-N
Quando dopo un sort viene utilizzato un limit(...), è possibile utilizzare un ordinamento top-n. Questa ottimizzazione limita l'utilizzo della memoria della fase di ordinamento
consentendole di memorizzare solo N documenti alla volta, come definito da
limit(...)—rendendo l'ordinamento più efficiente in termini di memoria.
Valori null e assenti
Se un campo specificato in un ordinamento non esiste in un documento, il relativo valore viene ordinato come se fosse null. Ad esempio, l'ordinamento delle città in base allo
state delle città, in ordine crescente rispetto al seguente
set di dati:
{ 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 i seguenti risultati in cui il documento "Toronto" e il documento "Mexico City" vengono ordinati come null e prima degli altri documenti.
{ 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 }