Opis
Sortuje dokumenty wejściowe na podstawie co najmniej 1 określonej kolejności 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 kolejnością typów wartości w kolumnie Cloud Firestore
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 porządkujące nie dają unikalnego porządku wśród zwracanych wyników, kolejność zwracanych wyników może się różnić między wykonaniami.
Na przykład sortowanie miast według country w kolejności rosnącej w tym zbiorze 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 dołączyć do kolejności sortowanie według name:
Node.js
const results = await db.pipeline()
.collection("/cities")
.sort(field("country").ascending(), fieldd("__name__").ascending())
.execute();
W przypadku gdy kilka dokumentów ma tę samą wartość country, jako rozstrzygająca zostanie użyta unikalna nazwa dokumentu. Pamiętaj, że każde inne pole, które wraz z polem country tworzy unikalny klucz dokumentu w kolekcji, może zostać użyte do uzyskania deterministycznej kolejności wyników.
Sortowanie równoważnych wartości
Równoważne wartości są sortowane razem, ale kolejność wyników w klasie równoważnej 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 tym zbiorze 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ą wartość size 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 Core API.
Optymalizacja sortowania Top-N
Gdy po sort używany jest limit(...), można użyć sortowania top-n. Ta optymalizacja ogranicza wykorzystanie pamięci na etapie sortowania, umożliwiając przechowywanie tylko N dokumentów naraz (zgodnie z definicją limit(...)), co zwiększa wydajność pamięci podczas sortowania.
Wartości null i brakujące wartości
Jeśli pole określone w kolejności nie istnieje w dokumencie, jego wartość jest sortowana tak, jakby miała wartość null. Na przykład sortowanie miast według state w kolejności rosnącej w tym zbiorze 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 },
zwraca te wyniki, w których dokument „Toronto” i dokument „Mexico City” są posortowane jako null i znajdują się 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 }