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
  1. En la Google Cloud consola, ve a la página Bases de datos.

    Ir a Bases de datos

  2. Selecciona una base de datos de la lista.
  3. En el menú de navegación, haga clic en Índices.
  4. Haz clic en Crear índice.
  5. Introduce un ID de colección.
  6. Añade una o varias rutas de campo y selecciona una opción de índice para cada una.
  7. Selecciona una opción de presencia de campo, ya sea no dispersa o dispersa.
  8. También puedes definir las opciones Índice de varias claves o Índice único.
  9. Haz clic en Crear.
  10. 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 o DESCENDING
  • DENSITY: uno de los valores SPARSE_ANY o DENSE

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
  1. En la Google Cloud consola, ve a la página Bases de datos.

    Ir a Bases de datos

  2. En la lista de bases de datos, selecciona una.
  3. En el menú de navegación, haga clic en Índices.
  4. En la lista de índices, elige Eliminar en el botón Más del índice que quieras eliminar.
  5. Haz clic en Eliminar índice.
CLI de gcloud
  1. 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.

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