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

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

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

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

Особенности работы ядра Firestore

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

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

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

Пользовательское индексирование

В отличие от стандартной версии, в корпоративной версии операция Core не создает индексы для отдельных полей автоматически. Индексы являются необязательными и не требуются для выполнения запроса. Если определенный индекс отсутствует, запрос выполняет полное сканирование коллекции. Хотя запросы без индексов позволяют быстро создавать прототипы, они могут работать медленнее и обходиться дороже по мере роста набора данных. Разработчикам необходимо вручную создавать индексы для оптимизации производительности запросов и снижения потребления единиц чтения (Read Unit).

Модель выставления счетов (на основе количества единиц товара)

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

Особенности работы трубопровода Firestore

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

Поэтапный составной синтаксис

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

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

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()

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

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

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

Чтобы узнать больше об этих возможностях, см. раздел «Запрос данных с помощью операций конвейера» .

Поддержка в режиме реального времени и в автономном режиме.

Для использования режимов Realtime и Offline разработчики могут применять основные операции Firestore Core в версии Firestore Enterprise.

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

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

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

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

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

Firestore Standard - Основные операции Firestore Enterprise — основные и конвейерные операции.
Требования к индексации Для выполнения запросов необходимы индексы.

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

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

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

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

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

Индексированные запросы: производительность и стоимость зависят от размера результирующего набора данных.

Мы рекомендуем использовать инструменты Query Explain и Query Insights для создания индексов и повышения производительности и снижения стоимости ваших запросов.

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

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

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