Solo es relevante para la edición Enterprise de Cloud Firestore. |
En esta página, se describe cómo administrar tus índices. Para obtener más información sobre los índices, consulta Descripción general de los índices.
Antes de comenzar
Antes de crear un índice en Cloud Firestore con compatibilidad con MongoDB, asegúrate de tener asignado alguno de los siguientes roles:
roles/datastore.owner
roles/datastore.indexAdmin
roles/editor
roles/owner
Para otorgar un rol, consulta Otorga un solo rol. Para obtener más información sobre los roles de Cloud Firestore y los permisos asociados, consulta Roles predefinidos.
Si definiste 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, completa los siguientes 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})
-
La creación de índices con
db.runCommand()
también se admite 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.
db.collection.createIndexes()
no es compatible. - Los registros de auditoría para la creación de índices con la API de MongoDB usan el nombre del método
google.firestore.admin.v1.FirestoreAdmin.CreateIndex
. - Para conocer las opciones de índice compatibles, consulta Índices y propiedades de los índices.
Consola de Firebase
-
En la consola Firebase, ve a la página Base de datos de Firestore:
- Selecciona una base de datos de la lista.
- En la pestaña Índices, haz clic en Crear índice.
- Ingresa un ID de colección.
- Agrega una o más 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.
- De manera opcional, puedes establecer la opción índice de varias claves.
- Haz clic en Crear.
- Tu índice nuevo se muestra en la lista de índices y Cloud Firestore con compatibilidad con MongoDB comienza a crear tu í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 en la compilación de índices para conocer las posibles causas.
gcloud CLI
Para crear un índice, usa el comando gcloud firestore indexes composite create
. Establece api-scope
en 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
Reemplaza lo siguiente:
- DATABASE_ID: Un ID de base de datos.
- COLLECTION: Es el nombre de una colección.
- FIELD_CONFIGURATION: Es una configuración de campo. Para cada campo, agrega
--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, establece --density=sparse-any
.
Para crear un índice de varias claves, agrega la marca --multikey
.
Para crear un índice único, agrega la marca --unique
.
Terraform
Usa el recurso google_firestore_index
y establece api_scope
en MONGODB_COMPATIBLE_API
y query_scope
en 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" }
Reemplaza lo siguiente:
- DATABASE_ID: Es el ID de la base de datos que elegiste.
- COLLECTION: Nombre de la colección que se indexará
- FIELD_PATH: Nombre del campo que se indexará
- ORDER: Uno de
ASCENDING
oDESCENDING
- DENSITY: Uno de
SPARSE_ANY
oDENSE
Borra un índice
Para borrar un índice, completa los siguientes pasos:
API de MongoDB
Usa el método dropIndex()
para borrar un índice. Por ejemplo:
Borra un índice con su nombre
db.restaurants.dropIndex("cuisine_index")
Cómo borrar un índice con la definición del índice
db.restaurants.dropIndex({"cuisine" : 1})
Consola de Firebase
-
En la consola Firebase, ve a la página Base de datos de Firestore:
- Selecciona una base de datos de la lista.
- Haz clic en la pestaña Índices.
- En la lista de índices, elige Borrar en el botón Más del índice que deseas borrar.
- Haz clic en Borrar índice.
gcloud CLI
Para encontrar el nombre del índice, usa el comando
gcloud firestore indexes composite list
.gcloud firestore indexes composite list \ --database='DATABASE_ID'
Reemplaza DATABASE_ID por el ID de la base de datos.
-
Para borrar el índice, usa el comando
gcloud firestore indexes composite delete
.gcloud firestore indexes composite delete INDEX_NAME \ --database='DATABASE_ID'
Reemplaza lo siguiente:
- INDEX_NAME: El nombre de un índice
- DATABASE_ID: Es un ID de base de datos.
Tiempo de compilación de índices
Para compilar un índice, Cloud Firestore con compatibilidad con MongoDB debe crear el índice y, luego, reabastecer las entradas del índice con los datos existentes. El tiempo necesario para crear un índice se determina según lo siguiente:
El tiempo de compilación mínimo de un índice es de unos minutos, incluso para una base de datos vacía.
El tiempo necesario para reabastecer las entradas de índice depende de la cantidad de datos existentes que pertenecen al índice nuevo. Cuantos más valores de campo coincidan con la definición del índice, más tiempo tardará el reabastecimiento de las entradas del índice.
Administra 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 los índices.
Después de que comienzas a crear un índice, Cloud Firestore con compatibilidad con MongoDB le asigna un nombre único a la operación. Los nombres de las operaciones incluyen el prefijo projects/PROJECT_ID/databases/DATABASE_ID/operations/
. Por ejemplo:
projects/PROJECT_ID/databases/DATABASE_ID/operations/ASA1MTAwNDQxNAgadGx1YWZlZAcSeWx0aGdpbi1zYm9qLW5pbWRhEgopEg
Puedes omitir el prefijo cuando especifiques el nombre de una operación para el comando describe
.
Enumera todas las operaciones de larga duración
Para enumerar las operaciones de larga duración, usa el comando gcloud firestore operations list
. Este comando enumera las operaciones en curso y las que se completaron recientemente.
Las operaciones se enumeran durante algunos días luego de completarse:
gcloud firestore operations list
Verifica el estado de la operación
En lugar de enumerar todas las operaciones de larga duración, puedes enumerar los detalles de una sola operación:
gcloud firestore operations describe operation-name
Estima la hora de finalización
A medida que se ejecuta tu operación, mira el valor del campo state
para conocer el estado general.
Una solicitud del estado de una operación de larga duración también muestra las métricas workEstimated
y workCompleted
. workEstimated
muestra la cantidad total estimada de documentos que procesará una operación. workCompleted
muestra la cantidad de documentos procesados hasta el momento. Una vez que se completa la operación, workCompleted
refleja la cantidad total de documentos que se procesaron, que podría 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 completa una operación, su descripción contendrá "done": true
. Consulta el valor del campo state
para ver el resultado de la operación. Si el campo done
no está establecido en la respuesta, significa que la operación no se completó.