Administrar índices en Cloud Firestore

Cloud Firestore garantiza el rendimiento de las consultas al requerir un índice para cada consulta. Los índices necesarios para las consultas más básicas se crean automáticamente . A medida que usas y pruebas tu aplicación, Cloud Firestore genera mensajes de error que te ayudan a crear índices adicionales que tu aplicación requiere. Esta página describe cómo administrar sus índices compuestos y de campo único .

Crear un índice faltante a través de un mensaje de error

Si intenta realizar una consulta compuesta con una cláusula de rango que no se asigna a un índice existente, recibirá un error. El mensaje de error incluye un enlace directo para crear el índice que falta en Firebase console.

Siga el enlace generado a Firebase console, revise la información que se completa automáticamente y haga clic en Crear .

Roles y permisos

Antes de poder crear un índice en Cloud Firestore, asegúrese de tener asignado cualquiera de los siguientes roles:

  • roles/datastore.owner
  • roles/datastore.indexAdmin
  • roles/editor
  • roles/owner

Si ha definido roles personalizados, asigne todos los permisos siguientes para crear índices:

  • datastore.indexes.create
  • datastore.indexes.delete
  • datastore.indexes.get
  • datastore.indexes.list
  • datastore.indexes.update

Usa la consola de Firebase

Para crear manualmente un nuevo índice desde Firebase console:

Imagen de la interfaz de indexación de Firestore en Firebase Console.

  1. Vaya a la sección Cloud Firestore de Firebase console .
  2. Vaya a la pestaña Índices y haga clic en Agregar índice .
  3. Ingrese el nombre de la colección y establezca los campos por los que desea ordenar el índice.
  4. Haga clic en Crear .

Los campos de índice deben cumplir con las restricciones de las rutas de campo .

Los índices pueden tardar unos minutos en crearse, según el tamaño de la consulta. Después de crearlos, podrá ver sus índices y su estado en la sección Índices compuestos. Si todavía están construyendo, Firebase console incluye una barra de estado de construcción.

Eliminar índices

Para eliminar un índice:

  1. Vaya a la sección Cloud Firestore de Firebase console .
  2. Haga clic en la pestaña Índices .
  3. Pase el cursor sobre el índice que desea eliminar y seleccione Eliminar en el menú contextual.
  4. Confirme que desea eliminarlo haciendo clic en Eliminar de la alerta.

Utilice la CLI de Firebase

También puede implementar índices con Firebase CLI . Para comenzar, ejecute firebase init firestore en el directorio de su proyecto. Durante la instalación, Firebase CLI genera un archivo JSON con los índices predeterminados en el formato correcto. Edite el archivo para agregar más índices e impleméntelo con el comando firebase deploy .

Para implementar solo índices y reglas de Cloud Firestore, agrega la marca --only firestore .

Si realiza ediciones en los índices usando Firebase console, asegúrese de actualizar también su archivo de índices local. Consulte la referencia de definición del índice JSON .

Usar terraformar

Creando índices en la base de datos.

La base de datos de Cloud Firestore puede incluir un índice de un solo campo o un índice compuesto. Puede editar el archivo de configuración de Terraform para crear un índice para su base de datos.

Índice de campo único

El siguiente ejemplo de archivo de configuración de Terraform crea un índice de campo único en el campo name en la colección chatrooms :

firestore.tf

resource "random_id" "variable"{
  byte_length = 8
}

resource "google_firestore_field" "single-index" {
  project = "project-id"
  database = "database-id"
  collection = "chatrooms_${random_id.variable.hex}"
  field = "name"

  index_config {
    indexes {
        order = "ASCENDING"
        query_scope = "COLLECTION_GROUP"
    }
    indexes {
        array_config = "CONTAINS"
    }
  }

  ttl_config {}
}
  • Reemplace project-id con su ID de proyecto. Los ID del proyecto deben ser únicos.
  • Reemplace database-id con el ID de su base de datos.

Índice compuesto

El siguiente archivo de configuración de Terraform de ejemplo crea un índice compuesto para una combinación del campo name y el campo description en la colección chatrooms :

firestore.tf

resource "google_firestore_index" "composite-index" {
  project = "project-id"
  database = "database-id"

  collection = "chatrooms"

  fields {
    field_path = "name"
    order      = "ASCENDING"
  }

  fields {
    field_path = "description"
    order      = "DESCENDING"
  }

}
  • Reemplace project-id con su ID de proyecto. Los ID del proyecto deben ser únicos.
  • Reemplace database-id con el ID de su base de datos.

Tiempo de creación del índice

Para crear un índice, Cloud Firestore debe configurarlo y luego rellenarlo con datos existentes. El tiempo de creación del índice es la suma del tiempo de configuración y el tiempo de reposición:

  • Configurar un índice lleva unos minutos. El tiempo mínimo de creación de un índice es de unos minutos, incluso para una base de datos vacía.

  • El tiempo de reposición depende de la cantidad de datos existentes que pertenecen al nuevo índice. Cuantos más valores de campo coincidan con la definición del índice, más tiempo llevará rellenar el índice.

La creación de índices son operaciones de larga duración .

Después de iniciar la creación de un índice, Cloud Firestore asigna a la operación un nombre único. Los nombres de las operaciones tienen el prefijo projects/[PROJECT_ID]/databases/(default)/operations/ , por ejemplo:

projects/project-id/databases/(default)/operations/ASA1MTAwNDQxNAgadGx1YWZlZAcSeWx0aGdpbi1zYm9qLW5pbWRhEgopEg

Sin embargo, puede omitir el prefijo al especificar un nombre de operación para el comando describe .

Listado de todas las operaciones de larga duración

Para enumerar operaciones de larga duración, usa el comando gcloud firestore Operations List . Este comando enumera las operaciones en curso y completadas recientemente. Las operaciones se enumeran durante unos días después de su finalización:

gcloud firestore operations list

Verificar estado de operación

En lugar de enumerar todas las operaciones de larga duración, puede enumerar los detalles de una sola operación:

gcloud firestore operations describe operation-name

Estimar el tiempo de finalización

A medida que se ejecuta la operación, consulte el valor del campo state para conocer 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 . Estas métricas se devuelven para la cantidad de documentos. workEstimated muestra el número total estimado de documentos que procesará una operación. workCompleted muestra la cantidad de documentos procesados ​​hasta el momento. Una vez completada la operación, workCompleted refleja la cantidad total de documentos que realmente se procesaron, que puede ser diferente al valor de workEstimated .

Divida workCompleted por workEstimated para una estimación aproximada del progreso. La estimación podría ser inexacta porque depende de un retraso en la recopilación de estadísticas.

Por ejemplo, aquí está el estado de 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 realiza una operación, la descripción de la operación contendrá "done": true . Consulte el valor del campo state para conocer el resultado de la operación. Si el campo done no está configurado en la respuesta, entonces su valor es false . No dependa de la existencia del valor done para las operaciones en curso.

Errores de creación de índices

Es posible que encuentre errores de creación de índices al administrar índices compuestos y exenciones de índices de un solo campo. Una operación de indexación puede fallar si Cloud Firestore encuentra un problema con los datos que está indexando. Lo más habitual es que esto signifique que ha alcanzado un límite de índice . Por ejemplo, es posible que la operación haya alcanzado el número máximo de entradas de índice por documento.

Si la creación del índice falla, verá el mensaje de error en la consola. Después de verificar que no está alcanzando ningún límite de índice , vuelva a intentar la operación de índice.