Gestionar índices
En esta página se describe cómo gestionar los índices. Para obtener más información sobre los índices, consulte el artículo Información general sobre los índices.
Antes de empezar
Antes de crear un índice en Firestore con compatibilidad con MongoDB, asegúrate de que tienes asignado alguno de los siguientes roles:
roles/datastore.owner
roles/datastore.indexAdmin
roles/editor
roles/owner
Para asignar un rol, consulta Asignar un rol concreto. Para obtener más información sobre los roles de Firestore y los permisos asociados, consulta Roles predefinidos.
Si has definido roles personalizados, asigna todos los permisos siguientes para crear índices:
datastore.indexes.create
datastore.indexes.delete
datastore.indexes.get
datastore.indexes.list
datastore.indexes.update
Crear un índice
Para crear un índice, sigue estos pasos:
API de MongoDB
Usa el método createIndex()
para crear un índice. Por ejemplo:
-
db.restaurants.createIndex({"cuisine" : 1})
-
db.restaurants.createIndex({"cuisine" : 1}, {sparse: true})
-
También se admite la creación de índices con
db.runCommand()
, con un máximo de un índice.db.runCommand({"createIndexes":"restaurant", "index": [{"key": {"cuisine":1}, {"name": "cuisine_index"}]})
Ten en cuenta las siguientes limitaciones:
- Solo puedes crear un índice por solicitud. No se admite
db.collection.createIndexes()
. - Los registros de auditoría de la creación de índices con la API de MongoDB usan el nombre del método
google.firestore.admin.v1.FirestoreAdmin.CreateIndex
. - Para ver las opciones de índice admitidas, consulta Índices y propiedades de índice.
Google Cloud consola
-
En la Google Cloud consola, ve a la página Bases de datos.
- Selecciona una base de datos de la lista.
- En el menú de navegación, haga clic en Índices.
- Haz clic en Crear índice.
- Introduce un ID de colección.
- Añade una o varias rutas de campo y selecciona una opción de índice para cada una.
- Selecciona una opción de presencia de campo, ya sea no dispersa o dispersa.
- También puedes definir las opciones Índice de varias claves o Índice único.
- Haz clic en Crear.
- El nuevo índice se muestra en la lista de índices y Firestore con compatibilidad con MongoDB empieza a crear el índice. Cuando se cree el índice, verás una marca de verificación verde junto a él. Si no se crea el índice, consulta Errores de creación de índices para ver las posibles causas.
CLI de gcloud
Para crear un índice, usa el comando
gcloud firestore indexes composite create
. Asigna el valor mongodb-compatible-api
a api-scope
.
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
Haz los cambios siguientes:
- DATABASE_ID: un ID de base de datos.
- COLLECTION: el nombre de la colección.
- FIELD_CONFIGURATION: una configuración de campo. En cada campo,
añade
--field-config=field-path=
. Por ejemplo:--field-config=field-path=user-id,order=descending \ --field-config=field-path=score,order=descending
Para obtener más información sobre cómo configurar estos campos, consulta
--field-config
.
Para crear un índice disperso, define --density=sparse-any
.
Para crear un índice de varias claves, añade la marca --multikey
.
Para crear un índice único, añade la marca --unique
.
Terraform
Usa el recurso google_firestore_index
y asigna el valor MONGODB_COMPATIBLE_API
a api_scope
y el valor COLLECTION_GROUP
a query_scope
.
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" }
Haz los cambios siguientes:
- DATABASE_ID: El ID de la base de datos que hayas elegido
- COLLECTION: nombre de la colección que se va a indexar
- FIELD_PATH: nombre del campo que se va a indexar
- ORDER: uno de los valores
ASCENDING
oDESCENDING
- DENSITY: uno de los valores
SPARSE_ANY
oDENSE
Eliminar un índice
Para eliminar un índice, sigue estos pasos:
API de MongoDB
Usa el método dropIndex()
para eliminar un índice. Por ejemplo:
Eliminar un índice por su nombre
db.restaurants.dropIndex("cuisine_index")
Eliminar un índice mediante la definición del índice
db.restaurants.dropIndex({"cuisine" : 1})
Google Cloud consola
-
En la Google Cloud consola, ve a la página Bases de datos.
- En la lista de bases de datos, selecciona una.
- En el menú de navegación, haga clic en Índices.
- En la lista de índices, elige Eliminar en el botón Más del índice que quieras eliminar.
- Haz clic en Eliminar índice.
CLI de gcloud
Para encontrar el nombre del índice, usa el comando
gcloud firestore indexes composite list
.gcloud firestore indexes composite list \ --database='DATABASE_ID'
Sustituye DATABASE_ID por el ID de la base de datos.
-
Para eliminar el índice, usa el comando
gcloud firestore indexes composite delete
.gcloud firestore indexes composite delete INDEX_NAME \ --database='DATABASE_ID'
Haz los cambios siguientes:
- INDEX_NAME: el nombre de un índice
- DATABASE_ID: un ID de base de datos
Tiempo de compilación del índice
Para crear un índice, Firestore con compatibilidad con MongoDB debe crear el índice y, a continuación, rellenar las entradas del índice con los datos existentes. El tiempo necesario para crear un índice se determina en función de lo siguiente:
El tiempo mínimo de compilación de un índice es de unos minutos, incluso en el caso de una base de datos vacía.
El tiempo necesario para reponer las entradas del índice depende de la cantidad de datos que ya haya en el nuevo índice. Cuantos más valores de campo coincidan con la definición del índice, más tiempo se tardará en rellenar las entradas del índice.
Gestionar operaciones de larga duración
Las compilaciones de índices son operaciones de larga duración. En las siguientes secciones se describe cómo trabajar con operaciones de larga duración para índices.
Después de empezar a crear un índice, Firestore con compatibilidad con MongoDB asigna un nombre único a la operación. Los nombres de las operaciones van precedidos de projects/PROJECT_ID/databases/DATABASE_ID/operations/
, por ejemplo:
projects/PROJECT_ID/databases/DATABASE_ID/operations/ASA1MTAwNDQxNAgadGx1YWZlZAcSeWx0aGdpbi1zYm9qLW5pbWRhEgopEg
Puedes omitir el prefijo al especificar un nombre de operación para el comando describe
.
Mostrar todas las operaciones de larga duración
Para enumerar las operaciones de larga duración, usa el comando
gcloud firestore operations list
. Este comando muestra las operaciones en curso y las que se han completado recientemente.
Las operaciones se muestran durante unos días después de completarse:
gcloud firestore operations list
Comprobar el estado de la operación
En lugar de enumerar todas las operaciones de larga duración, puedes consultar los detalles de una sola operación:
gcloud firestore operations describe operation-name
Estimar el tiempo de finalización
Mientras se ejecuta la operación, consulta el valor del campo state
para ver el estado general de la operación.
Una solicitud del estado de una operación de larga duración también devuelve las métricas workEstimated
y workCompleted
. workEstimated
muestra el número total estimado de documentos que procesará una operación. workCompleted
muestra el número de documentos procesados hasta el momento. Una vez completada la operación, workCompleted
refleja el número total de documentos que se han procesado, que puede ser diferente del valor de workEstimated
.
Para estimar el progreso de una operación, divide workCompleted
entre workEstimated
.
A continuación, se muestra un ejemplo del progreso de la creación de un índice:
{ "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" } }, }, ...
Cuando se complete una operación, la descripción de la operación contendrá "done": true
. Consulta el valor del campo state
para ver el resultado de la operación. Si el campo done
no se ha definido en la respuesta, significa que la operación no se ha completado.