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
-
Na Google Cloud consola, aceda à página Bases de dados.
- Selecione uma base de dados na lista de bases de dados.
- No menu de navegação, clique em Índices.
- Clique em Criar índice.
- Introduza um ID da coleção.
- Adicione um ou mais caminhos de campos e selecione uma opção de índice para cada um.
- Selecione uma opção de presença de campo, não esparsa ou esparsa.
- Opcionalmente, defina as opções de índice de várias chaves ou índice único.
- Clique em Criar.
- 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
ouDESCENDING
- DENSITY: Um de
SPARSE_ANY
ouDENSE
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
-
Na Google Cloud consola, aceda à página Bases de dados.
- Na lista de bases de dados, selecione uma base de dados.
- No menu de navegação, clique em Índices.
- Na lista de índices, escolha Eliminar no botão Mais para o índice que quer eliminar.
- Clique em Eliminar índice.
CLI gcloud
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.
-
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.