Sortuj

Opis

Sortuje dokumenty wejściowe na podstawie co najmniej 1 określonego porządku sortowania.

Składnia

W tym przykładzie kolekcja cities jest sortowana według pola population w kolejności rosnącej:

Node.js

const results = await db.pipeline()
  .collection("/cities")
  .sort(Field.of("population").ascending())
  .execute();

W tym przykładzie kolekcja cities jest sortowana rosnąco według length nazwy miasta.

Node.js

const results = await db.pipeline()
  .collection("/cities")
  .sort(Field.of("name").charLength().ascending())
  .execute();

Przykłady klientów

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 Firestorerodzajem 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 sort etap jest obecny, ale wyrażenia porządkujące nie zapewniają unikalnego porządkowania zwróconych wyników, kolejność 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 name:

Node.js

const results = await db.pipeline()
  .collection("/cities")
  .sort(Field.of("country").ascending(), Field.of("__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 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 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ą sizewartość3970000.

Wiele etapów sortowania

Jeśli zapytanie zawiera kilka kolejnych etapów sortowania, tylko ostatni z nich ma wpływ na wyniki zapytania. Pamiętaj, że różni się to od działania klauzuli orderBy w interfejsie Core API.

Optymalizacja sortowania N najlepszych wyników

Gdy po znaku sort występuje znak limit, może być użyte 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}