Opis
Sortuje dokumenty wejściowe na podstawie co najmniej 1 określonego porządku 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();
Zachowanie
Kolejność sortowania
Kolejność sortowania jest zgodna z Cloud Firestorekolejnością typów wartości
Deterministyczna kolejność wyników
Jeśli w zapytaniu nie ma etapu sort, kolejność zwracanych wyników jest nieokreślona i może się różnić w zależności od wykonania. Jeśli sort etap jest obecny, ale wyrażenia porządkowania nie zapewniają unikalnego porządkowania wśród zwróconych wyników, porządkowanie zwróconych wyników może się różnić w zależności od wykonania.
Na przykład posortuj miasta według country w porządku rosnącym na podstawie 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 wygenerować dowolną permutację 3 dokumentów w zbiorze danych, ponieważ wszystkie mają ten sam atrybut country. Aby uzyskać deterministyczną kolejność wyników, możesz dodać kolejność sortowania do parametru name:
Node.js
const results = await db.pipeline()
.collection("/cities")
.sort(field("country").ascending(), fieldd("__name__").ascending())
.execute();
W przypadku wielu dokumentów o tej samej wartości country jako kryterium rozstrzygające zostanie użyta 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 ramach równoważnej klasy nie jest deterministyczna zgodnie z omówieniem deterministycznej kolejności wyników. Na przykład sortowanie miast według size w porządku rosnącym na podstawie tego zbioru danych:
{ name: "Los Angeles", state: "CA", country: "USA", size: 3970000 },
{ name: "Mexico City", state: null, country: "Mexico", size: 3970000.0 },
może wygenerować dowolną permutację 2 dokumentów w zbiorze danych, ponieważ oba dokumenty mają równoważną size wartość 3970000.
Wiele etapów sortowania
Jeśli 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 interfejsie Core API.
Optymalizacja sortowania Top-N
Gdy po sort użyty zostanie limit(...), może zostać zastosowane sortowanie top-n. Ta optymalizacja ogranicza wykorzystanie pamięci na etapie sortowania, ponieważ umożliwia przechowywanie tylko N dokumentów naraz – zgodnie z ustawieniem limit(...) – co sprawia, że sortowanie jest bardziej efektywne pod względem wykorzystania pamięci.
Wartości null i wartości nieobecne
Jeśli pole określone w kolejności sortowania nie występuje w dokumencie, jego wartość jest sortowana tak, jakby wynosiła null. Na przykład posortuj miasta według state w porządku rosnącym na podstawie 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 następujące 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 }