Обзор Firestore в нативном режиме

Firestore в стандартном режиме состоит из двух наборов операций: Firestore Core и Firestore Pipeline.

Основные операции Firestore обеспечивают стандартные функции создания, чтения, обновления и удаления документов (CRUD), а также встроенную поддержку запросов на прослушивание в реальном времени и автономного сохранения. Основное отличие этой версии заключается в том, что индексы необязательны и не создаются автоматически для отдельных полей. Это позволяет выполнять запросы без предварительной настройки индекса, но при этом по умолчанию сканируется вся коллекция. Это может привести к увеличению задержки и затрат по мере роста набора данных.

Операции конвейера Firestore – это основная функция версии Firestore Enterprise, созданная на базе усовершенствованной системы запросов, которая значительно расширяет диапазон возможных запросов. В операциях конвейера используется гибкий синтаксис запросов и особый метод индексирования, при котором индексы не являются обязательными и не создаются автоматически. Это позволяет выполнять расширенные операции извлечения данных для приложений.

Функции основных операций Firestore

Основные операции позволяют выполнять стандартные операции CRUD и запросы на прослушивание в реальном времени. Однако при использовании этих операций в версии Enterprise базовое поведение в отношении индексирования и выставления счетов значительно меняется по сравнению с версией Standard.

Функциональность и непрерывность

Для основных операций сохраняется привычный синтаксис цепочки методов (например, .where(), .orderBy()), используемый в стандартной версии. Эти операции поддерживают запросы на прослушивание в реальном времени и автономное сохранение для мобильных и веб-клиентов. Рекомендуется использовать эти операции для стандартных транзакционных рабочих нагрузок, простых поисков и миграции существующего кода приложения.

Специальное индексирование

В отличие от версии Standard, в версии Enterprise основные операции не создают автоматически индексы по одному полю. Индексы необязательны и не требуются для выполнения запроса. Если определенный индекс отсутствует, запрос выполняет полное сканирование коллекции. Неиндексированные запросы позволяют быстро создавать прототипы, но по мере роста набора данных они могут выполняться медленнее и стоить дороже. Разработчики должны вручную создавать индексы, чтобы оптимизировать производительность запросов и сократить потребление единиц чтения.

Модель оплаты (на основе единиц)

Единицы чтения оплачиваются траншами по 4 КБ, а не по количеству документов. Неиндексированный запрос, сканирующий большую коллекцию, будет потреблять единицы чтения в зависимости от общего количества байтов, отсканированных во всех документах. Единицы записи оплачиваются траншами по 1 КБ. При записи документа единицы расходуются на данные и на каждую обновленную запись индекса. В отличие от стандартной версии, в которой применяется автоматическое индексирование по одному полю, теперь вы можете выбирать определенные поля для индексирования, чтобы оптимизировать затраты на запись и производительность.

Функции операций конвейера Firestore

В версии Firestore Enterprise с операциями конвейера используется усовершенствованная система запросов, которая устраняет многие ограничения, существующие в версии Firestore Standard. Операции конвейера предоставляют сотни дополнительных функций запросов. Операции конвейера имеют следующие возможности:

Синтаксис составных функций на основе этапов

Запросы конвейера создаются путем определения серии последовательных этапов, которые выполняются по порядку. Это позволяет выполнять сложные операции, например фильтровать результаты агрегирования, что раньше было невозможно.

В примере ниже показан запрос конвейера, который находит количество уникальных идентификаторов товаров, просмотренных за последний месяц:

guard let cutoffDate = Calendar.current.date(byAdding: .month, value: -1, to: Date()) else {
  return
}
let snapshot = try await db.pipeline()
  .collection("productViews")
  .where(Field("viewedAt").greaterThan(cutoffDate.timeIntervalSince1970))
  .aggregate([Field("productId").countDistinct().as("uniqueProductViews")])
  .execute()

Расширенные возможности

Запрос Pipeline предоставляет множество новых возможностей, в том числе:

  • Агрегирование. Поддержка новых функций агрегирования (например, sum(...), min(...) и count_distinct(...)) в сочетании с произвольными полями группировки.
  • Реляционные объединения. Выполняйте объединения на стороне сервера между коллекциями и подколлекциями с помощью коррелированных подзапросов.
  • Сложная фильтрация. Поддержка сотен дополнительных функций для выражения произвольно сложных инструкций where(...), включая regex_match(...), add(...) и str_contains(...), без жестких требований к индексам.
  • Частичное чтение / проекции. Извлекайте динамические подмножества документов с помощью select(...), remove_fields(...) и многих других этапов обработки документов.

Подробнее о запросах данных с помощью операций конвейера…

Поддержка в реальном времени и офлайн

Чтобы использовать функции Realtime и Offline, разработчики могут использовать основные операции Firestore в версии Firestore Enterprise.

Интеграция клиентов и инструментов

Версия Enterprise включает специализированные функции для взаимодействия с запросами Pipeline и управления ими:

  • Объяснение и профилирование запросов. Вы можете использовать результаты Query Explain, чтобы понять, сколько единиц чтения или записи потребляет запрос, и проанализировать его выполнение.
  • Статистика запросов. В версии Enterprise поддерживается статистика запросов, которая помогает определить, где можно создать индексы для повышения производительности и снижения затрат. Для этого предоставляется информация о наиболее популярных запросах, выполняемых в вашей базе данных, и их характеристиках производительности.
  • Новые типы индексов. В версии Enterprise можно создавать специализированные индексы, в том числе разреженные, неразреженные и уникальные. Также поддерживается создание и редактирование индексов векторного поиска для баз данных Enterprise.

Различия между версиями Firestore Standard и Firestore Enterprise

Основное различие между основными операциями и операциями конвейера заключается в управлении индексированием, которое напрямую влияет на производительность и стоимость.

Стандартная версия – основные операции Версия Enterprise – основные операции и операции конвейера
Требования к индексированию Для запросов требуются индексы.

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

Индексы не обязательны, поэтому их можно не использовать в запросах.

Индексы определяются по мере необходимости. Версия Enterprise также поддерживает более широкий диапазон типов индексов, включая разреженные и неразреженные, а также уникальные индексы.

Индексированные поля Если в индексированных полях нет поля __name__, оно добавляется автоматически. __name__ не добавляется автоматически к индексированным полям. Вам нужно явно указать __name__ в индексированных полях, если это важно для вашего приложения.
Нормализация порядка сортировки Предложение order by запроса нормализуется путем добавления полей неравенства и поля __name__ в конце (если они ещё не присутствуют). Это гарантирует уникальный детерминированный порядок результатов независимо от того, какие другие поля находятся в предложении order by. Нормализация порядка сортировки не выполняется. Порядок сортировки, например sort a ASC, гарантирует только то, что результаты будут отсортированы по полю a. Cloud Firestore будет использовать существующие индексы, чтобы возвращать результаты в наиболее эффективном порядке. Поэтому, если a не является уникальным в наборе результатов, порядок результатов может варьироваться от запроса к запросу в зависимости от конфигурации индекса, стратегий выполнения и т. д. Чтобы гарантировать уникальный детерминированный порядок результатов, вам необходимо добавить уникальное поле, например __name__, в порядок сортировки.
Производительность Индексированные запросы. Производительность и стоимость масштабируются в зависимости от размера набора результатов.

Неиндексированные запросы. Производительность и стоимость зависят от размера набора данных.

Индексированные запросы. Производительность и стоимость зависят от размера набора результатов.

Рекомендуем использовать инструменты Query Explain и Query Insights, чтобы создавать индексы и повышать эффективность запросов, снижая при этом расходы.

Стоимость хранения Автоматические и составные индексы занимают дополнительное место в хранилище. Вы экономите на хранении, поскольку индексы не создаются автоматически для каждого поля.
Базисная стоимость Плата взимается за каждую операцию чтения, записи и удаления документа. Плата взимается за единицу чтения (транши по 4 КБ) и единицу записи (транши по 1 КБ). Запись записей индекса потребляет единицы записи.

Ознакомьтесь с примерами новых цен.

Правила безопасности Правила безопасности защищают коллекции, проверяя разрешения на чтение и запись. Правила безопасности защищают коллекции, проверяя разрешения на чтение и запись. Подробнее о том, как моделировать данные для поддержки запросов Pipeline, рассказывается в руководстве по модели данных.