Sortieren

Beschreibung

Sortiert die Eingabedokumente anhand einer oder mehrerer angegebener Sortierreihenfolgen.

Beispiele

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();

Verhalten

Sortierreihenfolge

Die Sortierreihenfolge folgt Cloud Firestore's Werttypsortierung

Deterministische Reihenfolge der Ergebnisse

Wenn die Abfrage keine sort-Phase enthält, ist die Reihenfolge der zurückgegebenen Ergebnisse nicht deterministisch und kann sich zwischen den Ausführungen ändern. Wenn eine sort-Phase vorhanden ist, die Sortierausdrücke aber keine eindeutige Reihenfolge der zurückgegebenen Ergebnisse erzeugen, kann die Reihenfolge der zurückgegebenen Ergebnisse trotzdem zwischen den Ausführungen variieren.

Wenn Sie beispielsweise Städte nach dem country der Städte in aufsteigender Reihenfolge anhand des folgenden Datasets sortieren:

{ 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 },

kann jede Permutation der drei Dokumente im Dataset erzeugt werden, da alle dasselbe country Attribut haben. Um eine deterministische Reihenfolge der Ergebnisse zu erzeugen, können Sie der Reihenfolge eine Sortierreihenfolge für name hinzufügen:

Node.js

const results = await db.pipeline()
  .collection("/cities")
  .sort(field("country").ascending(), fieldd("__name__").ascending())
  .execute();

Dabei wird der eindeutige Dokumentname als Tiebreaker verwendet, wenn mehrere Dokumente denselben country Wert haben. Beachten Sie, dass alle anderen Felder, die zusammen mit dem country Feld einen eindeutigen Schlüssel des Dokuments in der Sammlung bilden, verwendet werden können, um eine deterministische Reihenfolge der Ergebnisse zu erzeugen.

Äquivalente Werte sortieren

Äquivalente Werte werden zusammen sortiert, aber die Reihenfolge der Ergebnisse innerhalb der äquivalenten Klasse ist gemäß der Diskussion zur deterministischen Reihenfolge der Ergebnissenicht deterministisch. Wenn Sie beispielsweise Städte nach size in aufsteigender Reihenfolge anhand des folgenden Datasets sortieren:

{ name: "Los Angeles", state: "CA", country: "USA", size: 3970000 },
{ name: "Mexico City", state: null, country: "Mexico", size: 3970000.0 },

kann jede Permutation der beiden Dokumente im Dataset erzeugt werden, da beide Dokumente den äquivalenten size Wert 3970000 haben.

Mehrere Sortierphasen

Wenn die Abfrage mehrere aufeinanderfolgende Sortierphasen enthält, wirkt sich nur die letzte Sortierphase auf die Abfrageergebnisse aus. Dies unterscheidet sich vom Verhalten der orderBy-Klausel in der Core API.

Top-N-Sortieroptimierung

Wenn nach einer sort-Phase ein limit(...) verwendet wird, kann eine Top-N-Sortierung verwendet werden. Diese Optimierung begrenzt die Arbeitsspeichernutzung der Sortierphase, indem sie nur N Dokumente gleichzeitig speichern kann, wie durch limit(...)definiert. Dadurch wird die Sortierung arbeitsspeichereffizienter.

Null- und fehlende Werte

Wenn ein in einer Sortierung angegebenes Feld in einem Dokument nicht vorhanden ist, wird sein Wert so sortiert, als wäre er null. Wenn Sie beispielsweise Städte nach dem state der Städte in aufsteigender Reihenfolge anhand des folgenden Datasets sortieren:

{ 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 },

werden die folgenden Ergebnisse erzeugt, wobei das Dokument „Toronto“ und das Dokument „Mexico City“ als null und vor anderen Dokumenten sortiert werden.

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