Puedes crear índices en campos de documentos incrustados dentro de arreglos. Estos índices mejoran el rendimiento de las queries en campos específicos integrados que aparecen en arreglos. Cuando creas un índice en un campo dentro de un arreglo, MongoDB almacena ese índice como un índice multiclave.
Para crear un índice, utilice el db.collection.createIndex()
método. Tu operación debería asemejarse a este prototipo:
db.<collection>.createIndex( { <field>: <sortOrder> } )
Acerca de esta tarea
El ejemplo en esta página utiliza una colección inventory que contiene estos documentos:
db.inventory.insertMany( [ { "item": "t-shirt", "stock": [ { "size": "small", "quantity": 8 }, { "size": "large", "quantity": 10 }, ] }, { "item": "sweater", "stock": [ { "size": "small", "quantity": 4 }, { "size": "large", "quantity": 7 }, ] }, { "item": "vest", "stock": [ { "size": "small", "quantity": 6 }, { "size": "large", "quantity": 1 } ] } ] )
Es necesario pedir más existencias cada vez que se tenga menos de cinco productos en acciones. Para determinar cuáles artículos se deben reordenar, query los documentos donde un elemento del arreglo stock tiene un quantity menor que 5. Para mejorar el rendimiento de esta consulta, puede crear un índice en el campo stock.quantity.
Procedimiento
La siguiente operación crea un índice multiclave ascendente en el campo stock.quantity de la colección inventory:
db.inventory.createIndex( { "stock.quantity": 1 } )
Debido a que stock contiene un valor de arreglo, MongoDB almacena este índice como un índice multiclave.
Resultados
El índice contiene una clave para cada valor individual que aparece en el campo stock.quantity. El índice es ascendente, lo que significa que las claves se almacenan en este orden: [ 1, 4, 6, 7, 8, 10 ].
El índice soporta consultas que seleccionan en el campo stock.quantity. Por ejemplo, la siguiente query devuelve documentos donde al menos un elemento en el arreglo stock tiene un quantity menor que 5:
db.inventory.find( { "stock.quantity": { $lt: 5 } } )
Salida:
[ { _id: ObjectId("63449793b1fac2ee2e957ef3"), item: 'vest', stock: [ { size: 'small', quantity: 6 }, { size: 'large', quantity: 1 } ] }, { _id: ObjectId("63449793b1fac2ee2e957ef2"), item: 'sweater', stock: [ { size: 'small', quantity: 4 }, { size: 'large', quantity: 7 } ] } ]
Ordenar resultados
El índice también soporta operaciones de ordenamiento en el campo stock.quantity, como en esta query:
db.inventory.find().sort( { "stock.quantity": -1 } )
Salida:
[ { _id: ObjectId("63449793b1fac2ee2e957ef1"), item: 't-shirt', stock: [ { size: 'small', quantity: 8 }, { size: 'large', quantity: 10 } ] }, { _id: ObjectId("63449793b1fac2ee2e957ef2"), item: 'sweater', stock: [ { size: 'small', quantity: 4 }, { size: 'large', quantity: 7 } ] }, { _id: ObjectId("63449793b1fac2ee2e957ef3"), item: 'vest', stock: [ { size: 'small', quantity: 6 }, { size: 'large', quantity: 1 } ] } ]
Cuando se ordena un arreglo de objetos en orden descendente, MongoDB ordena primero en función del campo con el elemento de mayor valor.