Creación de índices con caracteres comodín en núcleos virtuales de Azure Cosmos DB for MongoDB
SE APLICA A: núcleo virtual de MongoDB
Las cargas de trabajo que tienen un conjunto impredecible de campos en el esquema pueden usar índices comodín para admitir consultas en campos arbitrarios o desconocidos para optimizar el rendimiento.
La indexación con caracteres comodín puede resultar útil en los siguientes escenarios:
- Las consultas filtran por cualquier campo del documento, lo que hace que la indexación de todos los campos a través de un solo comando resulte más fácil que indexar cada campo individualmente.
- Las consultas filtran por la mayoría de los campos del documento, lo que hace que la indexación de todos los campos resulte más sencilla que indexar la mayoría de los campos individualmente.
Indexación de todos los campos
Configure un índice de caracteres comodín para facilitar las consultas en todos los campos de documento posibles, incluidos aquellos con nombres desconocidos o dinámicos.
db.collection.createIndex( { "$**": 1 } )
Importante
Para colecciones grandes, se recomienda usar el enfoque alternativo definido más adelante en este documento.
Incluir o excluir campos específicos
Los índices comodín también se pueden restringir a campos específicos, a la vez que se excluyen determinados campos de la indexación. Vamos a revisar un ejemplo para el siguiente json.
{
"firstName": "Steve",
"lastName": "Smith",
"companyName": "Microsoft",
"division": "Azure",
"timeInOrgInYears": 7
}
Podemos controlar el comportamiento de la indexación, el ejemplo restringe la creación de índices en los campos firstName
, lastName
y timeInOrgInYears
.
db.collection.createIndex( { "$**": 1 },
{"wildcardProjection" : { "firstName": 0
, "lastName": 0
, "companyName": 1
, "division": 1
, "timeInOrgInYears": 0
}
}
)
En el documento wildcardProjection, el valor 0 o 1 indica si el campo está incluido (1) o excluido (0) de la indexación.
Alternativa para indexar todos los campos
En este ejemplo se describe una solución sencilla para minimizar el esfuerzo necesario para crear índices individuales hasta que la indexación con caracteres comodín esté disponible de forma general en núcleos virtuales de Azure Cosmos DB for MongoDB.
Tenga en cuenta el documento JSON siguiente:
{
"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
}
]
}
Los índices siguientes se crean en segundo plano cuando se usa la indexación con caracteres comodín.
- 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})
Aunque este documento de ejemplo solo requiere que se indexe explícitamente una combinación de 10 campos, los documentos más grandes con cientos o miles de campos pueden ser tediosos y propensos a errores al indexar campos individualmente.
El archivo JAR detallado en el resto de este documento simplifica la indexación de campos en documentos más grandes. El JAR toma un documento JSON de ejemplo como entrada, analiza el documento y ejecuta comandos createIndex para cada campo sin necesidad de intervención del usuario.
Requisitos previos
Java 21
Después de implementar la máquina virtual, use SSH para conectarse a la máquina e instale CQLSH con los siguientes comandos:
# Install default-jdk
sudo apt update
sudo apt install openjdk-21-jdk
JAR de ejemplo para crear índices individuales para todos los campos
Clone el repositorio que contiene el ejemplo de Java para iterar cada campo de la estructura del documento JSON y emitir operaciones createIndex para cada campo del documento.
git clone https://github.com/Azure-Samples/cosmosdb-mongodb-vcore-wildcard-indexing.git
No es necesario compilar el repositorio clonado si no hay ningún cambio en la solución. El JAR ejecutable compilado denominado azure-cosmosdb-mongo-data-indexer-1.0-SNAPSHOT.jar ya está incluido en la carpeta runnableJar/. El JAR se puede ejecutar especificando los siguientes parámetros necesarios:
- Cadena de conexión del clúster del núcleo virtual de Azure Cosmos DB for MongoDB con el nombre de usuario y la contraseña usados cuando se aprovisionó el clúster
- Base de datos del núcleo virtual de Azure Cosmos DB for MongoDB
- Colección que se indexará
- Ubicación del archivo JSON con la estructura de documentos de la colección. El archivo JAR analiza este documento para extraer todos los campos y emitir operaciones createIndex individuales.
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
Seguimiento del estado de una operación createIndex
El archivo JAR está diseñado para no esperar una respuesta de cada operación createIndex. Los índices se crean de forma asincrónica en el servidor y se puede realizar un seguimiento del progreso de la operación de compilación de índices en el clúster.
Considere este ejemplo para realizar un seguimiento del progreso de la indexación de la base de datos "cosmicworks".
use cosmicworks;
db.currentOp()
Cuando una operación createIndex esté en curso, la respuesta será similar a la siguiente:
{
"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
}
Pasos siguientes
- Consulte el ejemplo de código: https://github.com/Azure-Samples/cosmosdb-mongodb-vcore-wildcard-indexing
- Revise aquí para obtener información sobre Indexación y limitaciones
- Más información sobre Procedimientos recomendados de indexación