Сортировать

Описание

Сортирует входные документы на основе одного или нескольких указанных порядков сортировки.

Примеры

Web

const results = await execute(db.pipeline()
  .collection("books")
  .sort(
    field("release_date").descending(), field("author").ascending()
  )
);
Быстрый
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();
Идти
snapshot := client.Pipeline().
	Collection("books").
	Sort(firestore.Orders(
		firestore.Descending(firestore.FieldOf("release_date")),
		firestore.Ascending(firestore.FieldOf("author")),
	)).
	Execute(ctx)

Поведение

Порядок сортировки

Порядок сортировки соответствует порядку типов значений в Cloud Firestore

Детерминированный порядок результатов

Если в запросе отсутствует этап sort , порядок возвращаемых результатов является недетерминированным и может меняться при каждом выполнении. Если этап sort присутствует, но выражения для упорядочивания не обеспечивают уникального порядка среди возвращаемых результатов, порядок возвращаемых результатов все равно может меняться при каждом выполнении.

Например, сортировка городов по country их происхождения в порядке возрастания по следующему набору данных:

{ 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 },

Можно получить любую перестановку из 3 документов в наборе данных, поскольку все они имеют одинаковый атрибут country . Для получения детерминированного порядка результатов можно добавить сортировку по name к порядку:

Node.js

const results = await db.pipeline()
  .collection("/cities")
  .sort(field("country").ascending(), fieldd("__name__").ascending())
  .execute();

В случае, если несколько документов имеют одинаковое значение country , в качестве критерия разрешения конфликтов будет использоваться уникальное имя документа. Обратите внимание, что любые другие поля, которые вместе с полем country образуют уникальный ключ документа в коллекции, могут быть использованы для создания детерминированного порядка результатов.

Сортировка эквивалентных значений

Эквивалентные значения сортируются вместе, но порядок результатов внутри эквивалентного класса не является детерминированным, согласно разделу «Детерминированный порядок результатов» . Например, сортировка городов по size в порядке возрастания по следующему набору данных:

{ name: "Los Angeles", state: "CA", country: "USA", size: 3970000 },
{ name: "Mexico City", state: null, country: "Mexico", size: 3970000.0 },

Можно получить любую перестановку из двух документов в наборе данных, поскольку оба документа имеют одинаковый size3970000 .

Многоступенчатая сортировка

Если запрос содержит несколько последовательных этапов сортировки, то на результаты запроса влияет только последний этап сортировки. Обратите внимание, что это отличается от поведения предложения orderBy в базовом API.

Оптимизация сортировки Top-N

Если после sort используется limit(...) , может быть применена сортировка по топ-n. Эта оптимизация ограничивает использование памяти на этапе сортировки, позволяя хранить только N документов одновременно — как определено оператором limit(...) — что делает сортировку более эффективной с точки зрения использования памяти.

Нулевые и отсутствующие значения

Если поле, указанное в порядке сортировки, отсутствует в документе, его значение сортируется так, как если бы оно было null . Например, сортировка городов по state в порядке возрастания по следующему набору данных:

{ 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 },

В результате получаются следующие документы, в которых документы "Торонто" и "Мехико" отображаются как null и находятся перед другими документами.

{ 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 }