Condividi tramite


Creare indici con caratteri jolly in Azure Cosmos DB for MongoDB vCore

SI APPLICA A: MongoDB vCore

I carichi di lavoro con un set imprevedibile di campi nello schema possono usare indici con caratteri jolly per supportare query su campi arbitrari o sconosciuti e ottimizzare le prestazioni.

L'indicizzazione con caratteri jolly può essere utile negli scenari seguenti:

  • Le query che filtrano in base a qualsiasi campo del documento semplificano l'indicizzazione di tutti i campi tramite un singolo comando rispetto all'indicizzazione di ogni campo singolarmente.
  • Le query che filtrano la maggior parte dei campi nel documento semplificano l'indicizzazione di tutti i campi, tranne alcuni, tramite un singolo comando rispetto all'indicizzazione della maggior parte dei campi singolarmente.

Indicizzare tutti i campi

Configurare un indice con caratteri jolly per facilitare le query su tutti i possibili campi del documento, inclusi quelli con nomi sconosciuti o dinamici.

db.collection.createIndex( { "$**": 1 } )

Importante

Per le raccolte di grandi dimensioni, è consigliabile usare l’approccio alternativo definito più avanti in questo documento.

Includere o escludere campi specifici

Gli indici con caratteri jolly possono anche essere limitati a campi specifici in modo da escludere alcuni campi come destinazioni per l'indicizzazione. Si esamini un esempio per il codice Json seguente.

{
    "firstName": "Steve",
    "lastName": "Smith",
    "companyName": "Microsoft",
    "division": "Azure",
    "timeInOrgInYears": 7
}

È possibile controllare il comportamento di indicizzazione: l'esempio limita la creazione di indici nei campi firstName,lastName e timeInOrgInYears.

db.collection.createIndex( { "$**": 1 },
                           {"wildcardProjection" : {  "firstName": 0
                                                    , "lastName": 0
                                                    , "companyName": 1
                                                    , "division": 1
                                                    , "timeInOrgInYears": 0
                                                   }
                           }
                         )

Nel documento wildcardProjection il valore 0 o 1 indica se il campo è incluso (1) o escluso (0) dall'indicizzazione.

Alternativa all'indicizzazione di tutti i campi

Questo esempio descrive una soluzione alternativa semplice per ridurre al minimo lo sforzo necessario per creare singoli indici fino a quando l'indicizzazione con caratteri jolly non è disponibile a livello generale in Azure Cosmos DB for MongoDB vCore.

Si consideri il documento JSON seguente:

{
    "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
        }
    ]
}

Gli indici seguenti vengono creati quando si utilizza l'indicizzazione con caratteri jolly.

  • 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})

Anche se questo documento di esempio richiede solo una combinazione di 10 campi da indicizzare in modo esplicito, i documenti più grandi con centinaia o migliaia di campi possono diventare noiosi e soggetti a errori durante l'indicizzazione dei campi eseguita singolarmente.

Il file JAR descritto nel resto di questo documento semplifica l'indicizzazione dei campi in documenti più grandi. Il file JAR accetta un documento JSON di esempio come input, analizza il documento ed esegue i comandi createIndex per ogni campo senza la necessità di intervento dell'utente.

Prerequisiti

Java 21

Dopo aver distribuito la macchina virtuale, usare SSH per connettersi al computer e installare CQLSH usando i comandi seguenti:

# Install default-jdk
sudo apt update
sudo apt install openjdk-21-jdk

File JAR di esempio per creare singoli indici per tutti i campi

Clonare il repository contenente l'esempio Java per scorrere ogni campo nella struttura del documento JSON ed eseguire operazioni createIndex per ogni campo del documento.

git clone https://github.com/Azure-Samples/cosmosdb-mongodb-vcore-wildcard-indexing.git

Non è necessario compilare il repository clonato se non sono presenti modifiche da apportare alla soluzione. Il file JAR eseguibile compilato denominato azure-cosmosdb-mongo-data-indexer-1.0-SNAPSHOT.jar è già incluso nella cartella runnableJar/. Il file JAR può essere eseguito specificando i parametri obbligatori seguenti:

  • Stringa di connessione del cluster vCore di Azure Cosmos DB for MongoDB con il nome utente e la password usati al momento del provisioning del cluster
  • Database vCore di Azure Cosmos DB for MongoDB
  • Raccolta da indicizzare
  • Percorso del file JSON con la struttura del documento per la raccolta. Questo documento viene analizzato dal file JAR per estrarre ogni campo ed eseguire singole operazioni 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

Tenere traccia dello stato di un'operazione createIndex

Il file JAR è progettato per non attendere una risposta da ogni operazione createIndex. Gli indici vengono creati in modo asincrono nel server e l'avanzamento dell'operazione di compilazione dell'indice nel cluster può essere monitorato.

Si consideri questo esempio per tenere traccia dello stato di avanzamento dell'indicizzazione nel database 'cosmicworks'.

use cosmicworks;
db.currentOp()

Quando è in corso un'operazione createIndex, la risposta è simile alla seguente:

{
  "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
}

Passaggi successivi