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 }