Gerenciar índices
Nesta página, descrevemos como gerenciar seus índices. Para saber mais sobre índices, consulte Visão geral dos índices.
Antes de começar
Antes de criar um índice no Firestore com compatibilidade com o MongoDB, confirme se um dos papéis a seguir foi atribuído:
roles/datastore.ownerroles/datastore.indexAdminroles/editorroles/owner
Para conceder um papel, consulte Conceder um único papel. Para mais informações sobre os papéis do Firestore e as permissões associadas, consulte Papéis predefinidos.
Se você tiver definido papéis personalizados, atribua todas as permissões a seguir para criar índices:
datastore.indexes.createdatastore.indexes.deletedatastore.indexes.getdatastore.indexes.listdatastore.indexes.update
Criar um índice
Para criar um índice, siga estas etapas:
API MongoDB
Use o método createIndex() para criar um índice. Exemplo:
-
db.restaurants.createIndex({"cuisine" : 1})
-
db.restaurants.createIndex({"cuisine" : 1}, {sparse: true})
-
A criação de índices com
db.runCommand()também é compatível com no máximo um índice.db.runCommand({"createIndexes":"restaurant", "index": [{"key": {"cuisine":1}, {"name": "cuisine_index"}]})
Observe as seguintes limitações:
- É possível criar apenas um índice por solicitação.
db.collection.createIndexes()não é compatível. - Os registros de auditoria para criação de índice com a API MongoDB usam o nome do método
google.firestore.admin.v1.FirestoreAdmin.CreateIndex. - Para opções de índice compatíveis, consulte índices e propriedades de índice.
Console doGoogle Cloud
-
No console do Google Cloud , acesse a página Bancos de dados.
- Selecione um banco de dados na lista.
- No menu de navegação, clique em Índices.
- Clique em Criar índice.
- Insira um ID de coleção.
- Adicione um ou mais caminhos de campo e selecione uma opção de índice para cada um.
- Selecione uma opção de presença de campo, esparsa ou não esparsa.
- Se quiser, defina as opções índice de várias chaves ou índice exclusivo.
- Clique em Criar.
- O novo índice é exibido na lista, e o Firestore com compatibilidade com o MongoDB começa a criá-lo. Quando o processo de criação terminar, você verá uma marca de seleção verde próxima ao índice. Se o índice não for criado, consulte Erros na criação do índice para descobrir as possíveis causas.
CLI da 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:
- DATABASE_ID: um ID do banco de dados.
- COLLECTION: um nome de coleção.
- FIELD_CONFIGURATION: uma configuração de campo. Para cada campo, adicione
--field-config=field-path=. Exemplo:--field-config=field-path=user-id,order=descending \ --field-config=field-path=score,order=descendingPara mais informações sobre como configurar esses campos, consulte
--field-config.
Para criar um índice esparso, defina --density=sparse-any.
Para criar um índice de várias chaves, adicione a sinalização --multikey.
Para criar um índice de várias chaves, adicione a sinalização --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:
- DATABASE_ID: o ID do banco de dados escolhido.
- COLLECTION: o nome da coleção a ser indexada.
- FIELD_PATH: o nome do campo a ser indexado
- ORDER: um de
ASCENDINGouDESCENDING - DENSITY: um de
SPARSE_ANYouDENSE
Criar um índice de texto
Crie um índice de texto se quiser fazer uma pesquisa de texto por strings específicas em uma coleção.
Para criar um índice de texto para sua coleção, siga estas etapas:
API MongoDB
Use o método
createIndex()
para criar um índice de texto.
No exemplo a seguir, quando um documento é gravado na coleção cities com os campos country ou food preenchidos, esses campos são indexados para fins de pesquisa.
db.cities.createIndex({"country": "text", "food": "text"})
Um campo precisa ser uma string ou uma matriz de strings para ser indexado.
Os índices de matriz não são indexados para pesquisa. Como resultado, a indexação de a.1.b vai indexar
something em {a: {1: {b: something}}}, mas não em
{a: [one, {b: something}]}.
Também é possível criar índices com db.runCommand(). É possível ter apenas um índice de texto por grupo de coleções, mas é possível criar vários índices de diferentes tipos em um db.runCommand(). O exemplo a seguir usa db.runCommand()
para criar um índice de texto:
db.runCommand({
createIndexes: "cities",
indexes: [
{
key: { "country": "text", "food": "text" },
name: "country_text_food_text"
}
]
})
Especificar um idioma padrão
Você também pode especificar um idioma padrão ou um caminho de campo no documento que vai conter o idioma padrão.
No exemplo a seguir, myLanguageField é especificado como o language_override. Quando um documento na coleção cities
contém um campo chamado myLanguageField, o valor desse campo
é usado para determinar o idioma da indexação do campo country para esse
documento específico. Esse valor substitui o idioma padrão de french.
db.cities.createIndex({"country": "text"}, {"default_language": "french", "language_override": "myLanguageField"})
- Você pode inserir um idioma usando o nome completo (
english) ou o código ISO de duas letras (en). - Se o idioma padrão não for definido, o Firestore vai usar o inglês.
- O campo de substituição de idioma precisa ser um campo de nível superior. Se não for definido, o campo de substituição de idioma vai usar o padrão
language. - Se você definir o idioma padrão como o caractere
null, o Firestore com compatibilidade com o MongoDB não usará nenhum campo como substituição de idioma.
Clique para conferir uma lista de idiomas disponíveis
| Código do idioma | Nome do idioma |
|---|---|
| "und" | Detectar automaticamente |
| "af" | Africâner |
| "ak" | Acã |
| "sq" | Albanês |
| "am" | Amárico |
| "ar" | Árabe |
| "hy" | Armênio |
| "az" | Azerbaijano |
| "eu" | Basco |
| "ser" | Bielorrusso |
| "bn" | Bengali |
| "bs" | Bósnio |
| "bg" | Búlgaro |
| "meu" | Birmanês |
| "ca" | Catalão |
| "ceb" | Cebuano |
| "chr" | Cheroqui |
| "zh" | Chinês |
| "zh-Hant" | Chinese_Traditional |
| "hr" | Croata |
| "cs" | Tcheco |
| "da" | Dinamarquês |
| "nl" | Holandês |
| "en" | Inglês |
| "eo" | Esperanto |
| "et" | Estoniano |
| "fil" | Filipino |
| "fi" | Finlandês |
| "fr" | Francês |
| "gl" | Galego |
| "ka" | Georgiano |
| "de" | Alemão |
| "el" | Grego |
| "gu" | Gujarati |
| "ht" | Crioulo_haitiano |
| "ha" | Hauçá |
| "haw" | Havaiano |
| "iw" | Hebraico |
| "oi" | Hindi |
| "hmn" | Hmong |
| "hu" | Húngaro |
| "is" | Islandês |
| "ig" | Igbo |
| "id" | Indonésio |
| "ga" | Irlandês |
| "it" | Italiano |
| "ja" | Japonês |
| "jv" | Javanês |
| "kn" | Canarês |
| "kk" | Cazaque |
| "km" | Khmer |
| "ko" | Coreano |
| "lo" | Laosiano |
| "la" | Latim |
| "lv" | Letão |
| "lt" | Lituano |
| "lb" | Luxemburguês |
| "mk" | Macedônio |
| "mg" | Malgaxe |
| "ms" | Malaio |
| "ml" | Malaiala |
| "mt" | Maltês |
| "mi" | Maori |
| "mr" | Marati |
| "mfe" | Morisyen |
| "mn" | Mongol |
| "sr-ME" | Serbian_Montenegro |
| "ne" | Nepalês |
| "não" | Norueguês |
| "ny" | Nianja |
| "ou" | Oriá |
| "fa" | Persa |
| "pl" | Polonês |
| "pt-BR" | Portuguese_Brazil |
| "pt-PT" | Portuguese_Portugal |
| "pa" | Punjabi |
| "ro" | Romeno |
| "ru" | Russo |
| "gd" | Gaélico escocês |
| "sr" | Sérvio |
| "st" | Soto do sul |
| "si" | Cingalês |
| "sk" | Eslovaco |
| "sl" | Esloveno |
| "então" | Somali |
| "es" | Espanhol |
| "su" | Sudanês |
| "sw" | Suaíli |
| "sv" | Sueco |
| "tg" | Tadjique |
| "ta" | Tâmil |
| "te" | Télugo |
| "th" | Tailandês |
| "tr" | Turco |
| "uk" | Ucraniano |
| "ur" | Urdu |
| "uz" | Uzbeque |
| "vi" | Vietnamita |
| "cy" | Galês |
| "yi" | Ídiche |
| "yo" | Iorubá |
| "zu" | Zulu |
Dividir um índice de texto
Também é possível particionar o índice usando um campo para filtrar consultas por um valor de campo específico. Essa configuração permite executar consultas mais eficientes se você sempre precisar de um campo específico filtrado no índice que está consultando.
Para criar um índice com uma partição, configure o campo firestoreOptions da seguinte maneira:
db.runCommand({
createIndexes: "cities",
indexes: [
{
key: { "country": "text", "food": "text"},
name: "country_text_food_text"
firestoreOptions: {"customPartitionFields": ["PARTITIONED_FIELD"]
}
]
})
Em que:
PARTITIONED_FIELDé o nome do campo usado para a partição. Esse valor precisa ser uma string e se referir a um campo de nível superior. Ao executar uma consulta em um índice particionado, é possível filtrar os resultados com base em um valor desse campo. Por exemplo, você pode particionar seu índice usandocity. Se um campocityfor definido no seu índice de texto, os usuários poderão consultar uma cidade específica.A partição precisa ser apenas um campo. Se você particionar um índice, só poderá executar consultas em que o campo particionado é especificado.
Limitações
- É possível criar apenas um índice por solicitação.
- Os registros de auditoria para criação de índice com a API MongoDB usam o nome do método
google.firestore.admin.v1.FirestoreAdmin.CreateIndex. - Para opções de índice compatíveis, consulte índices e propriedades de índice.
Console do Google Cloud
No Google Cloud console, acesse a página Bancos de dados.
Selecione um banco de dados na lista.
No menu de navegação, clique em Índices.
Clique em Criar índice e em Criar índice de pesquisa.
(Opcional) Insira um nome para o índice.
Acesse Tipo de pesquisa e selecione Texto.
Insira um ID de coleção.
Insira pelo menos um Caminho do campo.
Opcional: especifique um idioma padrão.
Por exemplo, defina o caminho de substituição do idioma como
myLanguageField. Quando um documento na sua coleção contém um campo chamadomyLanguageField, o valor desse campo é usado para determinar o idioma da indexação dos campos definidos no índice. Esse valor substitui o idioma padrão do seu índice.Clique em Criar.
O novo índice é exibido na lista, e as operações compatíveis com o MongoDB começam a criá-lo. Quando o processo de criação terminar, você verá uma marca de seleção verde próxima ao índice. Se o índice não for criado, consulte Erros na criação do índice para descobrir as possíveis causas.
Criar um índice 2dsphere
Crie um índice 2dsphere para realizar consultas geoespaciais e pesquisar documentos que existam em um determinado intervalo de uma longitude e latitude específicas.
Para criar um índice 2dsphere para sua coleção, siga estas etapas:
API MongoDB
Use o método
createIndex()
para criar um índice. Exemplo:
db.restaurants.createIndex({"location" : "2dsphere", "region": "2dsphere"})
A criação de índices com db.runCommand() também é compatível com no máximo um índice:
db.runCommand({
createIndexes: "restaurants",
indexes: [
{
key: { "location": "2dsphere", "region": "2dsphere" },
name: "location_2dsphere_region_2dsphere"
}
]
})
Particionar um índice 2dsphere
Também é possível particionar o índice usando um campo para filtrar consultas por um valor de campo específico. Essa configuração permite executar consultas mais eficientes se você sempre precisar de um campo específico filtrado no índice que está consultando.
Para criar um índice com uma partição, configure o campo firestoreOptions da seguinte maneira:
db.runCommand({
createIndexes: "restaurants",
indexes: [
{
key: { "location": "2dsphere", "region": "2dsphere" },
name: "location_2dsphere_region_2dsphere"
firestoreOptions: {"customPartitionFields": ["PARTITIONED_FIELD"]
}
]
})
Em que:
PARTITIONED_FIELDé o nome do campo usado para a partição. Ao executar uma consulta em um índice particionado, é possível filtrar os resultados com base em um valor desse campo. Por exemplo, se o índice tiver um camporegionpara locais regionais, você poderá particionar o índice usandoregionpara que os usuários possam consultar restaurantes na região deles.Se você particionar um índice, só poderá executar consultas em que o campo particionado é especificado.
Limitações
- É possível criar apenas um índice por solicitação.
- Os registros de auditoria para criação de índice com a API MongoDB usam o nome do método
google.firestore.admin.v1.FirestoreAdmin.CreateIndex. - Para opções de índice compatíveis, consulte índices e propriedades de índice.
Console do Google Cloud
No Google Cloud console, acesse a página Bancos de dados.
Selecione um banco de dados na lista.
No menu de navegação, clique em Índices.
Clique em Criar índice e em Criar índice de pesquisa.
Insira um ID de coleção.
Acesse Tipo de pesquisa e selecione Geo (2dsphere).
Clique em Criar.
O novo índice é exibido na lista, e as operações compatíveis com o MongoDB começam a criá-lo. Quando o processo de criação terminar, você verá uma marca de seleção verde próxima ao índice. Se o índice não for criado, consulte Erros na criação do índice para descobrir as possíveis causas.
Excluir um índice
Para excluir um índice, siga estas etapas:
API MongoDB
Use o método dropIndex() para excluir um índice. Exemplo:
Excluir um índice usando o nome dele
db.restaurants.dropIndex("cuisine_index")
Excluir um índice usando a definição de índice
db.restaurants.dropIndex({"cuisine" : 1})
Console doGoogle Cloud
-
No console do Google Cloud , acesse a página Bancos de dados.
- Na lista, selecione um banco de dados.
- No menu de navegação, clique em Índices.
- Na lista de índices, escolha Excluir no botão Mais do índice que você quer excluir.
- Clique em Excluir índice.
CLI da 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 do banco de dados.
-
Para excluir o índice, use o comando
gcloud firestore indexes composite delete.gcloud firestore indexes composite delete INDEX_NAME \ --database='DATABASE_ID'
Substitua:
- INDEX_NAME: o nome de um índice
- DATABASE_ID: um ID do banco de dados.
Tempo de criação do índice
Para criar um índice, o Firestore com compatibilidade com o MongoDB precisa criar o índice e, em seguida, preencher as entradas do índice com os dados atuais. O tempo necessário para criar um índice é determinado pelo seguinte:
O tempo de build mínimo de um índice é de alguns minutos, mesmo para um banco de dados vazio.
O tempo necessário para fazer o preenchimento das entradas de índice depende da quantidade de dados existentes que pertencem ao novo índice. Quanto mais valores de campo corresponderem à definição do índice, mais demorado será o preenchimento.
Gerenciar operações de longa duração
As versões de índice são operações de longa duração. As seções a seguir 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
um nome exclusivo à operação. Os nomes das operações são prefixados com projects/PROJECT_ID/databases/DATABASE_ID/operations/,
por exemplo:
projects/PROJECT_ID/databases/DATABASE_ID/operations/ASA1MTAwNDQxNAgadGx1YWZlZAcSeWx0aGdpbi1zYm9qLW5pbWRhEgopEg
É possível omitir o prefixo ao 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 firestore operations list. Esse comando lista as operações contínuas e as concluídas recentemente.
As operações são listadas por alguns dias após a conclusão:
gcloud firestore operations list
Verificar o status da operação
Em vez de listar todas as operações de longa duração, é possível listar os detalhes de uma única operação:
gcloud firestore operations describe operation-name
Como estimar o tempo de conclusão
Conforme sua operação é executada, consulte o valor do campo state
para o status geral da operação.
Uma solicitação para o status de uma operação de longa duração também retorna as métricas
workEstimated e workCompleted. workEstimated mostra o número total estimado
de documentos que uma
operação processará. workCompleted
mostra o número de documentos processados até o momento. 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.
Confira 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 for concluída, a descrição da operação vai conter
"done": true. Veja o valor do campo state para
o resultado da operação. Se o campo done não estiver definido na resposta,
isso significa que a operação não foi concluída.