Faça a gestão dos índices

Esta página descreve como gerir os seus índices. Para saber mais acerca dos índices, consulte o artigo Vista geral dos índices.

Antes de começar

Antes de poder criar um índice no Firestore com compatibilidade com o MongoDB, certifique-se de que lhe foi atribuída uma das seguintes funções:

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

Para conceder uma função, consulte o artigo Conceda uma única função. Para mais informações sobre as funções do Firestore e as autorizações associadas, consulte o artigo Funções predefinidas.

Se tiver definido funções personalizadas, atribua todas as seguintes autorizações para criar índices:

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

Crie um índice

Para criar um índice, conclua os seguintes passos:

API MongoDB

Use o método createIndex() para criar um índice. Por exemplo:

  •   db.restaurants.createIndex({"cuisine" : 1})
      
  •   db.restaurants.createIndex({"cuisine" : 1}, {sparse: true})
      
  • A criação de índices com db.runCommand() também é suportada com, no máximo, um índice.

      db.runCommand({"createIndexes":"restaurant", "index": [{"key": {"cuisine":1}, {"name": "cuisine_index"}]})
      

Tenha em atenção as seguintes limitações:

  • Só pode criar um índice por pedido. O db.collection.createIndexes() não é suportado.
  • Os registos de auditoria para a criação de índices com a API MongoDB usam o nome do método google.firestore.admin.v1.FirestoreAdmin.CreateIndex.
  • Para ver as opções de índice suportadas, consulte o artigo Índices e propriedades de índice.
Google Cloud consola
  1. Na Google Cloud consola, aceda à página Bases de dados.

    Aceda a Bases de dados

  2. Selecione uma base de dados na lista de bases de dados.
  3. No menu de navegação, clique em Índices.
  4. Clique em Criar índice.
  5. Introduza um ID da coleção.
  6. Adicione um ou mais caminhos de campos e selecione uma opção de índice para cada um.
  7. Selecione uma opção de presença de campo, não esparsa ou esparsa.
  8. Opcionalmente, defina as opções de índice de várias chaves ou índice único.
  9. Clique em Criar.
  10. O novo índice é apresentado na lista de índices e o Firestore com compatibilidade com o MongoDB começa a criar o índice. Quando o índice é criado, é apresentada uma marca de verificação verde junto ao índice. Se o índice não for criado, consulte Erros de criação de índice para ver as possíveis causas.
CLI gcloud

Para criar um índice, use o comando gcloud firestore indexes composite create. Defina api-scope como 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

Substitua o seguinte:

  • DATABASE_ID: um ID da base de dados.
  • COLLECTION: o nome de uma coleção.
  • FIELD_CONFIGURATION: uma configuração de campo. Para cada campo, adicione --field-config=field-path=. Por exemplo:
        --field-config=field-path=user-id,order=descending \
        --field-config=field-path=score,order=descending
        

    Para mais informações sobre a configuração destes campos, consulte o artigo --field-config.

Para criar um índice esparso, defina --density=sparse-any.

Para criar um índice de várias chaves, adicione a flag --multikey.

Para criar um índice único, adicione a flag --unique.

Terraform

Use o recurso google_firestore_index e defina api_scope como MONGODB_COMPATIBLE_API e query_scope como 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"
}

Substitua o seguinte:

  • DATABASE_ID: o ID da base de dados da base de dados escolhida
  • COLLECTION: o nome da coleção a indexar
  • FIELD_PATH: o nome do campo a indexar
  • ORDER: Um de ASCENDING ou DESCENDING
  • DENSITY: Um de SPARSE_ANY ou DENSE

Elimine um índice

Para eliminar um índice, conclua os seguintes passos:

API MongoDB

Use o método dropIndex() para eliminar um índice. Por exemplo:

Elimine um índice através do nome do índice

db.restaurants.dropIndex("cuisine_index")

Elimine um índice através da definição do índice

db.restaurants.dropIndex({"cuisine" : 1})
Google Cloud consola
  1. Na Google Cloud consola, aceda à página Bases de dados.

    Aceda a Bases de dados

  2. Na lista de bases de dados, selecione uma base de dados.
  3. No menu de navegação, clique em Índices.
  4. Na lista de índices, escolha Eliminar no botão Mais para o índice que quer eliminar.
  5. Clique em Eliminar índice.
CLI gcloud
  1. Para encontrar o nome do índice, use o comando gcloud firestore indexes composite list.

    gcloud firestore indexes composite list \
    --database='DATABASE_ID'

    Substitua DATABASE_ID pelo ID da base de dados.

  2. Para eliminar o índice, use o comando gcloud firestore indexes composite delete.

    gcloud firestore indexes composite delete INDEX_NAME \
    --database='DATABASE_ID'

    Substitua o seguinte:

    • INDEX_NAME: o nome de um índice
    • DATABASE_ID: um ID da base de dados

Tempo de criação do índice

Para criar um índice, o Firestore com compatibilidade com o MongoDB tem de criar o índice e, em seguida, preencher as entradas do índice com dados existentes. O tempo necessário para criar um índice é determinado pelo seguinte:

  • O tempo de compilação mínimo para um índice é de alguns minutos, mesmo para uma base de dados vazia.

  • O tempo necessário para preencher as entradas do índice depende da quantidade de dados existentes que pertencem ao novo índice. Quanto mais valores de campo corresponderem à definição do índice, mais tempo demora a preencher as entradas do índice.

Faça a gestão de operações de longa duração

As compilações de índices são operações de longa duração. As secções seguintes descrevem como trabalhar com operações de longa duração para índices.

Depois de começar a criar um índice, o Firestore com compatibilidade com o MongoDB atribui à operação um nome exclusivo. Os nomes das operações têm o prefixo projects/PROJECT_ID/databases/DATABASE_ID/operations/, por exemplo:

projects/PROJECT_ID/databases/DATABASE_ID/operations/ASA1MTAwNDQxNAgadGx1YWZlZAcSeWx0aGdpbi1zYm9qLW5pbWRhEgopEg

Pode omitir o prefixo quando especificar um nome de operação para o comando describe.

Apresente todas as operações de longa duração

Para apresentar uma lista de operações de longa duração, use o comando gcloud firestore operations list. Este comando apresenta as operações em curso e concluídas recentemente. As operações são apresentadas durante alguns dias após a conclusão:

gcloud firestore operations list

Verifique o estado da operação

Em vez de listar todas as operações de longa duração, pode listar os detalhes de uma única operação:

gcloud firestore operations describe operation-name

Estimar o tempo de conclusão

À medida que a operação é executada, veja o valor do campo state para o estado geral da operação.

Um pedido do estado de uma operação de longa duração também devolve as métricas workEstimated e workCompleted. workEstimated mostra o número total estimado de documentos que uma operação vai processar. workCompleted mostra o número de documentos processados até agora. Após a conclusão da operação, workCompleted reflete o número total de documentos que foram realmente processados, o que pode ser diferente do valor de workEstimated.

Para estimar o progresso de uma operação, divida workCompleted por workEstimated.

Segue-se um exemplo do progresso da criação de um í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"
        }
       },
    },
    ...

Quando uma operação é concluída, a descrição da operação contém "done": true. Consulte o valor do campo state para ver o resultado da operação. Se o campo done não estiver definido na resposta, a operação não foi concluída.