В нативном режиме Firestore состоит из двух наборов операций: операций Firestore Core и операций Firestore Pipeline.
The Firestore Core operations provide the standard document Create, Read, Update, and Delete (CRUD) functionality, along with built-in support for real-time listen queries and offline persistence. A distinct operational difference in this edition is that indexes are optional and are not automatically created for single fields. While this allows queries to execute without upfront index configuration, unindexed queries will default to scanning the entire collection. This can lead to increased latency and costs as the dataset grows.
Конвейерные операции Firestore — это ключевая функция версии Firestore Enterprise, построенная на основе усовершенствованного механизма запросов, значительно расширяющего диапазон возможных запросов. Конвейерные операции используют гибкий синтаксис запросов и особый метод индексирования, где индексы являются необязательными и не создаются автоматически, что позволяет приложениям выполнять расширенные операции извлечения данных.
Особенности работы ядра Firestore
Основные операции позволяют выполнять стандартные операции CRUD и запросы в реальном времени. Однако при использовании этих операций в версии Enterprise поведение, касающееся индексирования и выставления счетов, значительно меняется по сравнению с версией Standard.
Функциональность и непрерывность
Основные операции сохраняют привычный синтаксис цепочки методов (например, .where() , .orderBy() ), используемый в стандартной версии. Эти операции поддерживают запросы в реальном времени и сохранение данных в автономном режиме для мобильных и веб-клиентов. Рекомендуется использовать эти операции для стандартных транзакционных задач, простых запросов и миграции существующего кода приложений.
Пользовательское индексирование
Unlike the Standard edition, Core operations in the Enterprise edition does not automatically create single-field indexes. Indexes are optional and not required to execute a query. If a specific index is missing, the query performs a full collection scan. While unindexed queries allow for rapid prototyping, they may perform slower and cost more as the dataset grows. Developers must manually create indexes to optimize query performance and reduce the Read Unit consumption.
Модель выставления счетов (на основе количества единиц товара)
Read Units are charged in 4KB tranches rather than per document count. An unindexed query scanning a large collection will consume Read Units based on the total bytes scanned across all documents. Write Units are charged in 1KB tranches. Writing a document consumes units for the data plus additional units for every index entry updated. Unlike in the Standard edition, which enforces automatic single-field indexing, you can now choose specific fields to index to optimize write costs and performance.
Особенности работы трубопровода Firestore
Версия Firestore Enterprise с операциями Pipeline использует усовершенствованный механизм запросов, который устраняет многие существующие ограничения версии Firestore Standard. Операции Pipeline предоставляют сотни дополнительных функций для выполнения запросов. Возможности операций 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()
Расширенные возможности
Запрос Pipeline открывает множество новых возможностей, в том числе:
- Агрегации: Поддержка новых агрегирующих функций (таких как
sum(...),min(...)иcount_distinct(...)) в сочетании с произвольными полями группировки. - Реляционные соединения: Выполняйте соединения на стороне сервера между коллекциями и подколлекциями, используя коррелированные подзапросы .
- Сложная фильтрация: Поддержка сотен дополнительных функций для выражения произвольно сложных операторов
where(...), включаяregex_match(...),add(...)иstr_contains(...), без жестких требований к индексам. - Частичное чтение / Проекции: Извлечение динамических подмножеств документов с помощью
select(...),remove_fields(...)и многих других этапов обработки документов.
Чтобы узнать больше об этих возможностях, см. раздел «Запрос данных с помощью операций конвейера» .
Поддержка в режиме реального времени и в автономном режиме.
Для использования режимов Realtime и Offline разработчики могут применять операции Firestore Core в версии Firestore Enterprise.
Интеграция клиента и инструментов
В корпоративную версию входят специализированные функции для взаимодействия с запросами Pipeline и управления ими:
- Объяснение и профилирование запросов: Вы можете использовать результаты функции Query Explain, чтобы понять, сколько единиц чтения или записи потребляет запрос, и проанализировать его выполнение.
- Анализ запросов: В версии Enterprise поддерживается функция «Анализ запросов», которая помогает определить, где можно создать индексы для повышения производительности и снижения затрат, предоставляя информацию о наиболее часто выполняемых запросах к вашей базе данных и их характеристиках производительности.
- Новые типы индексов: Вы можете создавать специализированные индексы для версии Enterprise, включая такие типы индексов, как разреженные, неразреженные и уникальные индексы. Также поддерживается создание и редактирование векторных поисковых индексов для баз данных Enterprise.
Различия между Firestore Standard Edition и Firestore Enterprise Edition
Основное операционное различие между основными и вспомогательными операциями заключается в управлении индексированием, которое напрямую влияет на производительность и затраты.
| Стандартная версия - Основные операции | Корпоративная версия — основные операции и операции трубопровода | |
| Требования к индексации | Для выполнения запросов необходимы индексы. Индексы для отдельных полей создаются автоматически, в то время как более сложные запросы используют составные индексы или индексы групп коллекций, которые необходимо настраивать вручную. | Индексы не являются обязательными и, следовательно, необязательны для выполнения запросов. Индексы определяются по мере необходимости. Версия Enterprise также поддерживает более широкий спектр типов индексов, включая неразреженные/разреженные и уникальные индексы. |
| Индексированные поля | Дополнительное поле __name__ автоматически добавляется к индексированным полям, если оно еще не присутствует. | Поле __name__ не добавляется автоматически к индексированным полям. Если это важно для вашего приложения, вам необходимо явно указать __name__ в индексированных полях. |
| Нормализация порядка сортировки | В условии запроса ORDER BY происходит нормализация путем добавления в конец полей неравенства и поля __name__ (если оно еще не присутствует). Это гарантирует уникальный, детерминированный порядок результатов независимо от того, какие другие поля содержатся в условии ORDER BY. | No sort order normalization. A sort order such as sort a ASC only guarantees that results are sorted by field a . Cloud Firestore will use your existing indexes to return results in the most efficient order possible. Therefore, if a is not unique among the result set, the order of the results may vary from queries to queries depending on index configuration, execution strategies etc. To guarantee a unique, deterministic ordering of the results, you need to add a unique field such as __name__ to the sort order. |
| Производительность | Индексированные запросы: производительность и стоимость зависят от размера результирующего набора данных. | Неиндексированные запросы: производительность и стоимость зависят от размера вашего набора данных. Индексированные запросы: производительность и стоимость зависят от размера результирующего набора данных. Мы рекомендуем использовать инструменты Query Explain и Query Insights для создания индексов и повышения производительности и снижения стоимости ваших запросов. |
| Влияние затрат на хранение | Вы сталкиваетесь с дополнительными затратами на хранение данных из-за автоматических индексов и составных индексов. | Вы экономите на затратах на хранение, поскольку индексы не создаются автоматически для каждого поля. |
| Базовая себестоимость | Оплата взимается за каждую операцию чтения , записи и удаления документа. | Оплата взимается за единицу чтения (транши по 4 КБ) и единицу записи (транши по 1 КБ). Запись записей в индекс расходует единицы записи. Ознакомьтесь с новыми ценами на нескольких примерах . |
| Правила безопасности | Правила безопасности защищают коллекции, проверяя права на чтение/запись. | Правила безопасности защищают коллекции, проверяя права на чтение/запись. Узнайте, как моделировать данные для поддержки запросов Pipeline, в руководстве по модели данных . |