Catch up on highlights from Firebase at Google I/O 2023. Learn more

Управление индексами в Cloud Firestore

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

Создайте отсутствующий индекс через сообщение об ошибке

Если вы попытаетесь выполнить составной запрос с предложением диапазона, которое не соответствует существующему индексу, вы получите сообщение об ошибке. Сообщение об ошибке содержит прямую ссылку для создания отсутствующего индекса в консоли Firebase.

Перейдите по сгенерированной ссылке в консоль Firebase, просмотрите автоматически заполненную информацию и нажмите «Создать» .

Роли и разрешения

Прежде чем вы сможете создать индекс в Cloud Firestore, убедитесь, что вам назначена одна из следующих ролей:

  • roles/datastore.owner
  • roles/datastore.indexAdmin
  • roles/editor
  • roles/owner

Если вы определили настраиваемые роли, назначьте все следующие разрешения для создания индексов:

  • datastore.indexes.create
  • datastore.indexes.delete
  • datastore.indexes.get
  • datastore.indexes.list
  • datastore.indexes.update

Используйте консоль Firebase

Чтобы вручную создать новый индекс из консоли Firebase:

изображение интерфейса индексации firestore в консоли firebase

  1. Перейдите в раздел Cloud Firestore консоли Firebase .
  2. Перейдите на вкладку «Индексы» и нажмите «Добавить индекс» .
  3. Введите имя коллекции и установите поля, по которым вы хотите упорядочить индекс.
  4. Щелкните Создать .

Создание индексов может занять несколько минут, в зависимости от размера запроса. После того, как вы их создадите, вы сможете увидеть свои индексы и их статус в разделе Composite Indexes. Если они все еще строятся, консоль Firebase включает строку состояния сборки.

Удалить индексы

Чтобы удалить индекс:

  1. Перейдите в раздел Cloud Firestore консоли Firebase .
  2. Откройте вкладку Индексы .
  3. Наведите указатель мыши на индекс, который хотите удалить, и выберите «Удалить» в контекстном меню.
  4. Подтвердите, что хотите удалить его, нажав Удалить в предупреждении.

Используйте интерфейс командной строки Firebase

Вы также можете развернуть индексы с помощью интерфейса командной строки Firebase . Для начала запустите firebase init firestore в каталоге вашего проекта. Во время установки интерфейс командной строки Firebase создает файл JSON с индексами по умолчанию в правильном формате. Отредактируйте файл, чтобы добавить дополнительные индексы, и разверните его с помощью команды firebase deploy . Если вы хотите развернуть только индексы, добавьте флаг --only firestore:indexes . Если вы вносите изменения в индексы с помощью консоли Firebase, убедитесь, что вы также обновили файл локальных индексов. См. справочник по определению индекса JSON .

Время построения индекса

Чтобы создать индекс, Cloud Firestore должен настроить индекс, а затем заполнить индекс существующими данными. Время построения индекса представляет собой сумму времени настройки и времени обратной засыпки:

  • Настройка индекса занимает несколько минут. Минимальное время построения индекса составляет несколько минут даже для пустой базы данных.

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

Построение индекса — это длительная операция .

После запуска построения индекса Cloud Firestore присваивает операции уникальное имя. Имена операций имеют префикс projects/[PROJECT_ID]/databases/(default)/operations/ , например:

projects/project-id/databases/(default)/operations/ASA1MTAwNDQxNAgadGx1YWZlZAcSeWx0aGdpbi1zYm9qLW5pbWRhEgopEg

Однако вы можете не указывать префикс при указании имени операции для команды describe .

Список всех длительных операций

Чтобы получить список длительных операций, используйте команду списка операций gcloud firestore . Эта команда выводит список текущих и недавно завершенных операций. Операции перечислены в течение нескольких дней после завершения:

gcloud firestore operations list

Проверить статус операции

Вместо того, чтобы перечислять все длительные операции, вы можете перечислить детали одной операции:

gcloud firestore operations describe operation-name

Оценка времени завершения

Во время выполнения операции смотрите значение поля state для общего состояния операции.

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

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

Например, вот статус выполнения построения индекса:

{
  "operations": [
    {
      "name": "projects/project-id/operations/AyAyMDBiM2U5NTgwZDAtZGIyYi0zYjc0LTIzYWEtZjg1ZGdWFmZWQHEjF0c2Flc3UtcmV4ZWRuaS1uaW1kYRUKSBI",
      "metadata": {
        "@type": "type.googleapis.com/google.firestore.admin.v1.IndexOperationMetadata",
        "common": {
          "operationType": "CREATE_INDEX",
          "startTime": "2020-06-23T16:52:25.697539Z",
          "state": "PROCESSING"
        },
        "progressDocuments": {
          "workCompleted": "219327",
          "workEstimated": "2198182"
        }
       },
    },
    ...

Когда операция выполнена, описание операции будет содержать "done": true . См. значение поля state для результата операции. Если в ответе не задано поле done , то его значение равно false . Не зависьте от наличия значения done для незавершенных операций.

Ошибки построения индекса

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

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