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()
Расширенные возможности
Запросы конвейера предоставляют множество новых возможностей, в том числе:
- Агрегирование. Поддержка новых функций агрегирования (например,
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
Основное различие между операциями Core и Pipeline заключается в управлении индексированием, которое напрямую влияет на производительность и стоимость.
| Standard edition – основные операции | Версия 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, рассказывается в руководстве по модели данных. |