Sortuj

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 }