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