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

Относится только к версии Cloud Firestore Enterprise.

На этой странице описано, как управлять индексами. Подробнее об индексах см. в разделе «Обзор индексов» .

Прежде чем начать

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

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

Чтобы предоставить роль, см. раздел «Предоставление одной роли» . Дополнительные сведения о ролях Cloud Firestore и связанных с ними разрешениях см. в разделе «Предопределенные роли» .

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

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

Создать индекс

Чтобы создать индекс, выполните следующие шаги:

API MongoDB

Используйте метод createIndex() для создания индекса. Например:

  •   db.restaurants.createIndex({"cuisine" : 1})
      
  •   db.restaurants.createIndex({"cuisine" : 1}, {sparse: true})
      
  • Также поддерживается создание индекса с помощью db.runCommand() (максимум один индекс).

      db.runCommand({"createIndexes":"restaurant", "index": [{"key": {"cuisine":1}, {"name": "cuisine_index"}]})
      

Обратите внимание на следующие ограничения:

  • Вы можете создать только один индекс для одного запроса. db. collection .createIndexes() не поддерживается.
  • Журналы аудита для создания индекса с помощью API MongoDB используют имя метода google.firestore.admin.v1.FirestoreAdmin.CreateIndex .
  • Поддерживаемые параметры индексов см. в разделах Индексы и свойства индексов .
Консоль Firebase
  1. В консоли Firebase перейдите на страницу базы данных Firestore .

    Перейти к базе данных Firestore

  2. Выберите базу данных из списка баз данных.
  3. На вкладке «Индексы» нажмите кнопку «Создать индекс» .
  4. Введите идентификатор коллекции .
  5. Добавьте один или несколько путей полей и выберите параметр индекса для каждого.
  6. Выберите вариант присутствия поля: неразреженное или разреженное.
  7. При желании можно установить опцию многоключевого индекса .
  8. Нажмите «Создать» .
  9. Ваш новый индекс отобразится в списке индексов, и Cloud Firestore с поддержкой MongoDB начнёт его создание. После создания индекса рядом с ним появится зелёная галочка. Если индекс не создан, см . раздел «Ошибки построения индекса» для получения информации о возможных причинах.
gcloud CLI

Чтобы создать индекс, используйте команду gcloud firestore indexes composite create . Установите для api-scope значение mongodb-compatible-api .

gcloud firestore indexes composite create \
--database='DATABASE_ID' \
--collection-group=COLLECTION \
--field-config=FIELD_CONFIGURATION \
--query-scope=collection-group \
--density=dense \
--api-scope=mongodb-compatible-api

Заменить следующее:

  • DATABASE_ID : идентификатор базы данных.
  • COLLECTION : название коллекции.
  • FIELD_CONFIGURATION : конфигурация поля. Для каждого поля добавьте --field-config=field-path= . Например:
        --field-config=field-path=user-id,order=descending \
        --field-config=field-path=score,order=descending
        

    Дополнительную информацию о настройке этих полей см. в разделе --field-config .

Чтобы создать разреженный индекс, задайте --density=sparse-any .

Чтобы создать многоключевой индекс, добавьте флаг --multikey .

Чтобы создать уникальный индекс, добавьте флаг --unique .

Терраформировать

Используйте ресурс google_firestore_index и установите api_scope на MONGODB_COMPATIBLE_API , а query_scope на COLLECTION_GROUP .

resource "google_firestore_index" "index" {
  database    = "DATABASE_ID"
  collection  = "COLLECTION"
  api_scope   = "MONGODB_COMPATIBLE_API"
  query_scope = "COLLECTION_GROUP"

  // You can include multiple field blocks
  fields {
    field_path = "FIELD_PATH"
    order      = "ORDER"
  }

  // Optional
  multikey = true
  density  = "DENSITY"
}

Заменить следующее:

  • DATABASE_ID : идентификатор выбранной вами базы данных.
  • COLLECTION : Название индексируемой коллекции.
  • FIELD_PATH : Имя поля для индексации
  • ORDER : Один из ASCENDING или DESCENDING
  • DENSITY : Один из вариантов: SPARSE_ANY или DENSE

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

Чтобы удалить индекс, выполните следующие действия:

API MongoDB

Для удаления индекса используйте метод dropIndex() . Например:

Удалить индекс, используя имя индекса

db.restaurants.dropIndex("cuisine_index")

Удалить индекс, используя определение индекса

db.restaurants.dropIndex({"cuisine" : 1})
Консоль Firebase
  1. В консоли Firebase перейдите на страницу базы данных Firestore .

    Перейти к базе данных Firestore

  2. Выберите базу данных из списка баз данных.
  3. Откройте вкладку «Индексы» .
  4. В списке индексов выберите Удалить с помощью кнопки «Дополнительно» для индекса, который вы хотите удалить.
  5. Нажмите Удалить индекс .
gcloud CLI
  1. Чтобы найти имя индекса, используйте команду gcloud firestore indexes composite list .

    gcloud firestore indexes composite list \
    --database='DATABASE_ID'

    Замените DATABASE_ID на идентификатор базы данных.

  2. Чтобы удалить индекс, используйте команду gcloud firestore indexes composite delete .

    gcloud firestore indexes composite delete INDEX_NAME \
    --database='DATABASE_ID'

    Заменить следующее:

    • INDEX_NAME : имя индекса
    • DATABASE_ID : идентификатор базы данных

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

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

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

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

Управление длительными операциями

Построение индексов — это длительная операция . В следующих разделах описывается, как работать с длительными операциями для индексов.

После начала создания индекса Cloud Firestore, совместимый с MongoDB, присваивает операции уникальное имя. Имена операций начинаются с префикса projects/ PROJECT_ID /databases/ DATABASE_ID /operations/ , например:

projects/PROJECT_ID/databases/DATABASE_ID/operations/ASA1MTAwNDQxNAgadGx1YWZlZAcSeWx0aGdpbi1zYm9qLW5pbWRhEgopEg

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

Перечислите все длительные операции

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

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 в ответе не задано, операция не завершена.