Встроенный режим 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 КБ). Запись записей в индекс расходует единицы записи. Ознакомьтесь с новыми ценами на нескольких примерах . |
| Правила безопасности | Правила безопасности защищают коллекции, проверяя права на чтение/запись. | Правила безопасности защищают коллекции, проверяя права на чтение/запись. Узнайте, как моделировать данные для поддержки запросов в конвейере обработки данных, в руководстве по модели данных . |