Administra índices

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
  1. En la consola Firebase, ve a la página Base de datos de Firestore:

    Ir a la base de datos de Firestore

  2. Selecciona una base de datos de la lista.
  3. En la pestaña Índices, haz clic en Crear índice.
  4. Ingresa un ID de colección.
  5. Agrega una o más rutas de campo y selecciona una opción de índice para cada una.
  6. Selecciona una opción de presencia de campo, ya sea no dispersa o dispersa.
  7. De manera opcional, puedes establecer la opción índice de varias claves.
  8. Haz clic en Crear.
  9. 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 o DESCENDING
  • DENSITY: Uno de SPARSE_ANY o DENSE

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
  1. En la consola Firebase, ve a la página Base de datos de Firestore:

    Ir a la base de datos de Firestore

  2. Selecciona una base de datos de la lista.
  3. Haz clic en la pestaña Índices.
  4. En la lista de índices, elige Borrar en el botón Más del índice que deseas borrar.
  5. Haz clic en Borrar índice.
gcloud CLI
  1. 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.

  2. 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ó.