Ordina

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 }