O Firestore no modo Datastore usa índices para cada consulta que a sua aplicação faz.
Estes índices são atualizados sempre que uma entidade é alterada, pelo que os resultados podem ser devolvidos rapidamente quando a aplicação faz uma consulta. O modo Datastore fornece índices incorporados automaticamente, mas precisa de saber antecipadamente que índices compostos a aplicação vai precisar. Especifica os índices compostos de que a sua aplicação precisa num ficheiro de configuração. O emulador do Datastore pode gerar automaticamente a configuração do índice composto do modo Datastore à medida que testa a sua aplicação. A ferramenta de linha de comandos gcloud
fornece comandos para atualizar os índices disponíveis para a sua base de dados do modo Datastore de produção.
Requisitos de sistema
Para usar a CLI gcloud, tem de ter instalado a CLI Google Cloud.
Acerca do index.yaml
Cada consulta do modo Datastore feita por uma aplicação precisa de um índice correspondente.
Os índices para consultas simples, como consultas sobre uma única propriedade, são criados automaticamente. Os índices compostos para consultas complexas têm de ser definidos num ficheiro de configuração
denominado index.yaml
. Este ficheiro é carregado com a aplicação para criar
índices compostos numa base de dados do modo Datastore.
O emulador do Datastore adiciona automaticamente itens a este ficheiro quando a aplicação tenta executar uma consulta que precisa de um índice composto que não tenha uma entrada adequada no ficheiro de configuração. Pode ajustar os índices compostos ou criar novos manualmente editando o ficheiro. O index.yaml
está localizado na pasta
<project-directory>/WEB-INF/
. Por predefinição, o diretório de dados que contém WEB-INF/appengine-generated/index.yaml
é ~/.config/gcloud/emulators/datastore/
. Consulte o artigo
Diretórios do projeto do emulador do Datastore para ver detalhes adicionais.
Segue-se um exemplo de um ficheiro index.yaml
:
indexes:
- kind: Task
ancestor: no
properties:
- name: done
- name: priority
direction: desc
- kind: Task
properties:
- name: collaborators
direction: asc
- name: created
direction: desc
- kind: TaskList
ancestor: yes
properties:
- name: percent_complete
direction: asc
- name: type
direction: asc
A sintaxe de index.yaml
está no formato YAML. Para mais informações sobre esta sintaxe, consulte o Website do YAML.
Definições do índice composto
index.yaml
tem um único elemento de lista denominado indexes
. Cada elemento na lista representa um índice composto para a aplicação.
Um elemento de índice pode ter os seguintes elementos:
kind
- O tipo de entidade da consulta. Este elemento é obrigatório.
properties
Uma lista de propriedades a incluir como colunas do índice composto, na ordem em que devem ser ordenadas: propriedades usadas primeiro em filtros de igualdade, seguidas da propriedade usada em filtros de desigualdade e, em seguida, as ordens de ordenação e as respetivas direções.
Cada elemento nesta lista tem os seguintes elementos:
name
- O nome do modo Datastore da propriedade.
direction
- A direção da ordenação,
asc
para ascendente oudesc
para descendente. Isto só é necessário para propriedades usadas em ordens de classificação da consulta e tem de corresponder à direção usada pela consulta. A predefinição éasc
.
ancestor
yes
se a consulta tiver uma cláusula de antepassado. A predefinição éno
.
Índices compostos automáticos e manuais
Quando o emulador do Datastore adiciona uma definição de índice composto gerada a
index.yaml
, fá-lo abaixo da seguinte linha, inserindo-a, se necessário:
# AUTOGENERATED
O emulador considera todas as definições de índice composto abaixo desta linha como automáticas e pode atualizar as definições existentes abaixo desta linha à medida que a aplicação faz consultas.
Todas as definições de índice composto acima desta linha são consideradas sob controlo manual e não são atualizadas pelo emulador. O emulador só faz alterações abaixo da linha e só o faz se o ficheiro index.yaml
completo não descrever um índice composto que tenha em conta uma consulta executada pela aplicação. Para assumir o controlo de uma definição de índice composto automático, mova-a acima desta linha.
Atualizar índices compostos
O comando datastore indexes create
analisa a configuração do índice composto do Datastore local (o ficheiro index.yaml
) e, se a configuração do índice composto definir um índice composto que ainda não exista na base de dados do modo Datastore de produção, a base de dados cria o novo índice composto. Consulte o fluxo de trabalho de desenvolvimento com a CLI gcloud
para ver um exemplo de como usar indexes create
.
Para criar um índice composto, a base de dados tem de configurar o índice composto e, em seguida, preencher o índice composto com dados existentes. O tempo de criação do índice composto é a soma do tempo de configuração e do tempo de preenchimento:
A configuração de um índice composto demora alguns minutos. O tempo mínimo de criação de um índice composto é de alguns minutos, mesmo para uma base de dados vazia.
O tempo de preenchimento depende da quantidade de dados existentes que pertencem ao novo índice composto. Quanto mais valores de propriedades pertencerem ao índice composto, mais tempo demora a preencher o índice composto.
Se a aplicação executar uma consulta que exija um índice composto que ainda não tenha sido criado, a consulta gera uma exceção. Para evitar esta situação, tem de ter cuidado ao implementar uma nova versão da sua aplicação que exija um índice composto antes de o novo índice composto terminar a criação.
Pode verificar o estado dos índices compostos na página Índices na Google Cloud consola.
Eliminar índices compostos não usados
Quando altera ou remove um índice composto da configuração do índice composto, o índice composto original não é eliminado automaticamente da base de dados do modo Datastore. Isto dá-lhe a oportunidade de deixar uma versão mais antiga da aplicação em execução enquanto os novos índices compostos estão a ser criados ou de reverter imediatamente para a versão mais antiga se for detetado um problema com uma versão mais recente.
Quando tiver a certeza de que já não precisa dos índices compostos antigos, pode eliminá-los
com o comando datastore indexes cleanup
. Este comando elimina todos os índices compostos da instância do modo Datastore de produção que não são mencionados na versão local de index.yaml
. Consulte
o fluxo de trabalho de desenvolvimento com a CLI gcloud para ver um exemplo de como
usar indexes cleanup
.
Argumentos da linha de comandos
Para ver detalhes sobre argumentos de linha de comandos para criar e limpar índices compostos, consulte
datastore indexes create
e datastore indexes cleanup
,
respetivamente. Para ver detalhes sobre os argumentos de linha de comandos para a CLI gcloud, consulte
a referência da CLI gcloud.
Gerir operações de longa duração
As compilações de índices compostos são operações de longa duração e podem demorar um período considerável a serem concluídas.
Depois de iniciar uma compilação de índice composto, o modo Datastore atribui um nome exclusivo à operação. Os nomes das operações têm o prefixo projects/[PROJECT_ID]/databases/(default)/operations/
, por exemplo:
projects/project-id/databases/(default)/operations/ASA1MTAwNDQxNAgadGx1YWZlZAcSeWx0aGdpbi1zYm9qLW5pbWRhEgopEg
No entanto, pode omitir o prefixo quando especificar um nome de operação para o comando describe
.
Listar todas as operações de longa duração
Para listar operações de longa duração, use o comando gcloud datastore 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
gcloud datastore operations list
descanso
Antes de usar qualquer um dos dados do pedido, faça as seguintes substituições:
- project-id: o ID do seu projeto
Método HTTP e URL:
GET https://datastore.googleapis.com/v1/projects/project-id/operations
Para enviar o seu pedido, expanda uma destas opções:
Veja informações sobre a resposta abaixo.
Por exemplo, uma compilação de índice composto concluída recentemente mostra as seguintes informações:
{ "operations": [ { "name": "projects/project-id/operations/S01vcFVpSmdBQ0lDDCoDIGRiNTdiZDQNmE4YS0yMTVmNWUzZSQadGx1YWZlZAcSMXRzYWVzdS1yZXhlZG5pLW5pbWRhFQpWEg", "done": true, "metadata": { "@type": "type.googleapis.com/google.datastore.admin.v1.IndexOperationMetadata", "common": { "endTime": "2020-06-23T16:55:29.923562Z", "operationType": "CREATE_INDEX", "startTime": "2020-06-23T16:55:10Z", "state": "SUCCESSFUL" }, "indexId": "CICAJiUpoMK", "progressEntities": { "workCompleted": "2193027", "workEstimated": "2198182" } }, "response": { "@type": "type.googleapis.com/google.datastore.admin.v1.Index", "ancestor": "NONE", "indexId": "CICAJiUpoMK", "kind": "Task", "projectId": "project-id", "properties": [ { "direction": "ASCENDING", "name": "priority" }, { "direction": "ASCENDING", "name": "done" }, { "direction": "DESCENDING", "name": "created" } ], "state": "READY" } }, ] }
Descrever uma única operação
Em vez de listar todas as operações de longa duração, pode listar os detalhes de uma única operação:
gcloud
Use o comando operations describe
para mostrar o estado
de uma compilação de índice composto.
gcloud datastore operations describe operation-name
descanso
Antes de usar qualquer um dos dados do pedido, faça as seguintes substituições:
- project-id: o ID do seu projeto
Método HTTP e URL:
GET https://datastore.googleapis.com/v1/projects/project-id/operations
Para enviar o seu pedido, expanda uma destas opções:
Veja informações sobre a resposta abaixo.
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
. Estas métricas são devolvidas para o número de entidades. workEstimated
mostra o número total estimado de entidades que uma operação vai processar, com base nas estatísticas da base de dados. workCompleted
mostra o número de entidades processadas até agora. Após a conclusão da operação, workCompleted
reflete o número total de entidades que foram realmente processadas, o que pode ser diferente do valor de workEstimated
.
Divida workCompleted
por workEstimated
para uma estimativa aproximada do progresso. A estimativa pode ser imprecisa porque depende da recolha de estatísticas atrasadas.
Por exemplo, segue-se o estado de progresso de uma compilação de índice composto:
{ "operations": [ { "name": "projects/project-id/operations/AyAyMDBiM2U5NTgwZDAtZGIyYi0zYjc0LTIzYWEtZjg1ZGdWFmZWQHEjF0c2Flc3UtcmV4ZWRuaS1uaW1kYRUKSBI", "metadata": { "@type": "type.googleapis.com/google.datastore.admin.v1.IndexOperationMetadata", "common": { "operationType": "CREATE_INDEX", "startTime": "2020-06-23T16:52:25.697539Z", "state": "PROCESSING" }, "progressEntities": { "workCompleted": "219327", "workEstimated": "2198182" } }, }, ...
Quando uma operação estiver 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,
o respetivo valor é false
. Não dependa da existência do valor done
para operações em curso.