Beschreibung
Sortiert die Eingabedokumente anhand von mindestens einer angegebenen Sortierreihenfolge.
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();
Go
snapshot := client.Pipeline(). Collection("books"). Sort(firestore.Orders( firestore.Descending(firestore.FieldOf("release_date")), firestore.Ascending(firestore.FieldOf("author")), )). Execute(ctx)
Verhalten
Sortierreihenfolge
Die Sortierreihenfolge entspricht der Reihenfolge der Wertetypen von Cloud Firestore.
Deterministische Reihenfolge der Ergebnisse
Wenn in der Abfrage keine sort-Phase vorhanden ist, ist die Reihenfolge der zurückgegebenen Ergebnisse nicht deterministisch und kann sich zwischen den Ausführungen ändern. Wenn eine sort-Phase vorhanden ist, die Sortierungsausdrücke aber keine eindeutige Sortierung der zurückgegebenen Ergebnisse ermöglichen, kann die Reihenfolge der zurückgegebenen Ergebnisse zwischen den Ausführungen variieren.
Wenn Sie beispielsweise die Städte im folgenden Dataset nach dem country der Städte in aufsteigender Reihenfolge 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 erzeugen, da sie alle dasselbe country-Attribut haben. Wenn Sie eine deterministische Reihenfolge der Ergebnisse erzielen möchten, 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();
Der eindeutige Dokumentname wird als Entscheidungskriterium verwendet, wenn mehrere Dokumente denselben country-Wert haben. Alle anderen Felder, die zusammen mit dem Feld country einen eindeutigen Schlüssel des Dokuments in der Sammlung bilden, können verwendet werden, um eine deterministische Reihenfolge der Ergebnisse zu erzielen.
Ä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 Ergebnisse nicht deterministisch. Wenn Sie beispielsweise Städte nach size in aufsteigender Reihenfolge sortieren, erhalten Sie für das folgende Dataset:
{ 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 erzeugen, da beide Dokumente den entsprechenden size-Wert 3970000 haben.
Mehrere Sortierphasen
Wenn die Abfrage mehrere aufeinanderfolgende Sortierphasen enthält, wirkt sich nur die letzte Sortierphase auf die Abfrageergebnisse aus. Das Verhalten unterscheidet sich von dem der orderBy-Klausel in der Core API.
Optimierung der Sortierung nach Top N
Wenn nach einem sort ein limit(...) verwendet wird, kann eine Top-N-Sortierung verwendet werden. Durch diese Optimierung wird die Speichernutzung der Sortierphase begrenzt, da nur N Dokumente gleichzeitig gespeichert werden können. Dies wird durch limit(...) definiert. Dadurch wird die Sortierung speichereffizienter.
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 der Wert null. Wenn Sie beispielsweise Städte nach dem state der Städte in aufsteigender Reihenfolge sortieren, erhalten Sie für das folgende Dataset:
{ 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 },
führt zu den folgenden Ergebnissen, 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 }