Opis
Sortuje dokumenty wejściowe na podstawie co najmniej 1 określonego kryterium sortowania.
Przykłady
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)
Zachowanie
Kolejność sortowania
Kolejność sortowania jest zgodna z Cloud Firestore's kolejnością typów wartości.
Deterministyczna kolejność wyników
Jeśli w zapytaniu nie ma etapu sort, kolejność zwracanych wyników jest niedeterministyczna i może się różnić w zależności od wykonania. Jeśli etap sort jest obecny, ale wyrażenia sortowania nie zapewniają unikalnej kolejności zwracanych wyników, kolejność zwracanych wyników może się nadal różnić w zależności od wykonania.
Na przykład sortowanie miast według country w kolejności rosnącej w odniesieniu do tego zbioru danych:
{ 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 },
może spowodować dowolną permutację 3 dokumentów w zbiorze danych, ponieważ wszystkie mają ten sam country atrybut. Aby uzyskać deterministyczną kolejność wyników, możesz dodać kolejność sortowania według name do kolejności:
Node.js
const results = await db.pipeline()
.collection("/cities")
.sort(field("country").ascending(), fieldd("__name__").ascending())
.execute();
W przypadku, gdy wiele dokumentów ma tę samą wartość country, jako kryterium rozstrzygające będzie używana unikalna nazwa dokumentu. Pamiętaj, że do uzyskania deterministycznej kolejności wyników można użyć dowolnych innych pól, które wraz z polem country tworzą unikalny klucz dokumentu w kolekcji.
Sortowanie równoważnych wartości
Równoważne wartości są sortowane razem, ale kolejność wyników w klasie równoważności nie jest deterministyczna zgodnie z omówieniem deterministycznej kolejności wyników. Na przykład sortowanie miast według size w kolejności rosnącej w odniesieniu do tego zbioru danych:
{ name: "Los Angeles", state: "CA", country: "USA", size: 3970000 },
{ name: "Mexico City", state: null, country: "Mexico", size: 3970000.0 },
może spowodować dowolną permutację 2 dokumentów w zbiorze danych, ponieważ oba
dokumenty mają równoważną size wartość 3970000.
Wiele etapów sortowania
Gdy zapytanie zawiera kilka kolejnych etapów sortowania, tylko ostatni etap sortowania ma wpływ na wyniki zapytania. Pamiętaj, że różni się to od działania klauzuli orderBy w podstawowym interfejsie API.
Optymalizacja sortowania Top-N
Gdy po sort używana jest funkcja limit(...), może być używane sortowanie Top-N. Ta optymalizacja ogranicza wykorzystanie pamięci przez etap sortowania, umożliwiając mu przechowywanie tylko N dokumentów naraz – zgodnie z definicją
limit(...) – co sprawia, że sortowanie jest bardziej wydajne pod względem pamięci.
Wartości null i brakujące
Jeśli pole określone w kolejności nie istnieje w dokumencie, jego wartość jest sortowana tak, jakby była równa null. Na przykład sortowanie miast według
state miast w kolejności rosnącej w odniesieniu do tego
zbioru danych:
{ 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 },
daje te wyniki, w których dokumenty „Toronto” i „Mexico City” są sortowane jako null i przed innymi dokumentami.
{ 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 }