Compartilhar via


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