Относится только к версии 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
В консоли Firebase перейдите на страницу базы данных Firestore .
- Выберите базу данных из списка баз данных.
- На вкладке «Индексы» нажмите кнопку «Создать индекс» .
- Введите идентификатор коллекции .
- Добавьте один или несколько путей полей и выберите параметр индекса для каждого.
- Выберите вариант присутствия поля: неразреженное или разреженное.
- При желании можно установить опцию многоключевого индекса .
- Нажмите «Создать» .
- Ваш новый индекс отобразится в списке индексов, и 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
В консоли Firebase перейдите на страницу базы данных Firestore .
- Выберите базу данных из списка баз данных.
- Откройте вкладку «Индексы» .
- В списке индексов выберите Удалить с помощью кнопки «Дополнительно» для индекса, который вы хотите удалить.
- Нажмите Удалить индекс .
gcloud CLI
Чтобы найти имя индекса, используйте команду
gcloud firestore indexes composite list
.gcloud firestore indexes composite list \ --database='DATABASE_ID'
Замените DATABASE_ID на идентификатор базы данных.
Чтобы удалить индекс, используйте команду
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
в ответе не задано, операция не завершена.