Criar índices de curinga no Azure Cosmos DB for MongoDB vCore
APLICA-SE AO: MongoDB vCore
Cargas de trabalho que têm um conjunto imprevisível de campos no esquema podem usar índices curinga para dar suporte a consultas em campos arbitrários ou desconhecidos, para desempenho otimizado.
A indexação de curinga pode ser útil nos seguintes cenários:
- Filtragem de consultas em qualquer campo do documento, tornando mais fácil a indexação de todos os campos por meio de um único comando do que indexar cada campo individualmente.
- Filtragem de consultas na maioria dos campos do documento, tornando a indexação de todos os campos, exceto alguns, por meio de um único, mais fácil do que indexar a maioria dos campos individualmente.
Indexando todos os campos
Configure um índice curinga para facilitar consultas em todos os campos de documento possíveis, incluindo aqueles com nomes desconhecidos ou dinâmicos.
db.collection.createIndex( { "$**": 1 } )
Importante
Para grandes coleções, recomendamos usar a abordagem alternativa definida posteriormente neste documento.
Incluir ou excluir campos específicos
Índices curinga também podem ser restritos a campos específicos, excluindo determinados campos de serem direcionados para indexação. Vamos examinar um exemplo para o Json a seguir.
{
"firstName": "Steve",
"lastName": "Smith",
"companyName": "Microsoft",
"division": "Azure",
"timeInOrgInYears": 7
}
Podemos controlar o comportamento de indexação, o exemplo restringe a criação de índices no campo firstName
, lastName
e timeInOrgInYears
.
db.collection.createIndex( { "$**": 1 },
{"wildcardProjection" : { "firstName": 0
, "lastName": 0
, "companyName": 1
, "division": 1
, "timeInOrgInYears": 0
}
}
)
No documento wildcardProjection, o valor 0 ou 1 indica se o campo está incluído (1) ou excluído (0) da indexação.
Alternativa para indexar todos os campos
Este exemplo descreve uma solução alternativa simples para minimizar o esforço necessário para criar índices individuais até que a indexação curinga esteja geralmente disponível no Azure Cosmos DB for MongoDB vCore.
Considere o documento json abaixo:
{
"firstName": "Steve",
"lastName": "Smith",
"companyName": "Microsoft",
"division": "Azure",
"subDivision": "Data & AI",
"timeInOrgInYears": 7,
"roles": [
{
"teamName" : "Windows",
"teamSubName" "Operating Systems",
"timeInTeamInYears": 3
},
{
"teamName" : "Devices",
"teamSubName" "Surface",
"timeInTeamInYears": 2
},
{
"teamName" : "Devices",
"teamSubName" "Surface",
"timeInTeamInYears": 2
}
]
}
Os índices a seguir são criados nas capas quando a indexação curinga é usada.
- db.collection.createIndex({"firstName", 1})
- db.collection.createIndex({"lastName", 1})
- db.collection.createIndex({"companyName", 1})
- db.collection.createIndex({"division", 1})
- db.collection.createIndex({"subDivision", 1})
- db.collection.createIndex({"timeInOrgInYears", 1})
- db.collection.createIndex({"subDivision", 1})
- db.collection.createIndex({"roles.teamName", 1})
- db.collection.createIndex({"roles.teamSubName", 1})
- db.collection.createIndex({"roles.timeInTeamInYears", 1})
Embora este documento de exemplo exija apenas uma combinação de 10 campos para serem indexados explicitamente, documentos maiores com centenas ou milhares de campos podem ficar tediosos e propensos a erros ao indexar campos individualmente.
O arquivo jar detalhado no restante deste documento torna os campos de indexação em documentos maiores mais simples. O jar usa um documento JSON de exemplo como entrada, analisa o documento e executa comandos createIndex para cada campo sem a necessidade de intervenção do usuário.
Pré-requisitos
Java 21
Após a implantação da máquina virtual, use o SSH para se conectar ao computador e instale o CQLSH usando os comandos abaixo:
# Install default-jdk
sudo apt update
sudo apt install openjdk-21-jdk
Jar de exemplo para criar índices individuais para todos os campos
Clone o repositório que contém o exemplo java para iterar por meio de cada campo na estrutura do documento JSON e emita operações createIndex para cada campo no documento.
git clone https://github.com/Azure-Samples/cosmosdb-mongodb-vcore-wildcard-indexing.git
O repositório clonado não precisa ser criado se não houver alterações a serem feitas na solução. O jar executável criado chamado azure-cosmosdb-mongo-data-indexer-1.0-SNAPSHOT.jar já está incluído na pasta runnableJar/. O jar pode ser executado especificando os seguintes parâmetros necessários:
- Cadeia de conexão do cluster vCore do Azure Cosmos DB for MongoDB com o nome de usuário e a senha usados quando o cluster foi provisionado
- Banco de dados do vCore do Azure Cosmos DB for MongoDB
- A coleção a ser indexada
- O local do arquivo json com a estrutura do documento para a coleção. Este documento é analisado pelo arquivo jar para extrair cada campo e emitir operações individuais createIndex.
java -jar azure-cosmosdb-mongo-data-indexer-1.0-SNAPSHOT.jar mongodb+srv://<user>:<password>@abinav-test-benchmarking.global.mongocluster.cosmos.azure.com/?tls=true&authMechanism=SCRAM-SHA-256&retrywrites=false&maxIdleTimeMS=120000 cosmicworks employee sampleEmployee.json
Acompanhar o status de uma operação createIndex
O arquivo jar foi projetado para não aguardar uma resposta de cada operação createIndex. Os índices são criados de forma assíncrona no servidor e o progresso da operação de build de índice no cluster pode ser acompanhado.
Considere esse exemplo para acompanhar o progresso da indexação no banco de dados “cosmicworks”.
use cosmicworks;
db.currentOp()
Quando uma operação createIndex está em andamento, a resposta é semelhante a:
{
"inprog": [
{
"shard": "defaultShard",
"active": true,
"type": "op",
"opid": "30000451493:1719209762286363",
"op_prefix": 30000451493,
"currentOpTime": "2024-06-24T06:16:02.000Z",
"secs_running": 0,
"command": { "aggregate": "" },
"op": "command",
"waitingForLock": false
},
{
"shard": "defaultShard",
"active": true,
"type": "op",
"opid": "30000451876:1719209638351743",
"op_prefix": 30000451876,
"currentOpTime": "2024-06-24T06:13:58.000Z",
"secs_running": 124,
"command": { "createIndexes": "" },
"op": "workerCommand",
"waitingForLock": false,
"progress": {},
"msg": ""
}
],
"ok": 1
}
Próximas etapas
- Consulte o exemplo de código – https://github.com/Azure-Samples/cosmosdb-mongodb-vcore-wildcard-indexing
- Examine aqui para indexação e limitações
- Saiba mais sobre Melhores práticas de indexação