MongoDB proporciona indexación para la ejecución eficiente de consultas sin índices. MongoDB tiene que buscar en cada documento para que coincida con la consulta, lo cual es muy ineficiente. Los índices son fáciles de recorrer y almacenar documentos ordenados según los campos especificados. A diferencia del índice de un solo campo en el que la indexación se realiza en un solo campo, los índices compuestos indexan múltiples campos del documento en orden ascendente o descendente, es decir, ordenará los datos de un campo y luego ordenará los datos de otro campo O, en otras palabras, los índices compuestos son aquellos índices en los que un único campo de índice contiene referencias a varios campos. En MongoDB, el índice compuesto puede contener un solo campo de índice hash, si un campo contiene más de un campo de índice hash, MongoDB dará un error.
¿Cómo crear un índice compuesto?
En MongoDB, podemos crear un índice compuesto usando el método createIndex().
Sintaxis:
db.collection.createIndex({<campo1>: <tipo1>, <campo2>: <tipo2>, …})
Aquí <tipo> representa el valor del campo en la especificación del índice y describe el tipo de índice para ese campo. Por ejemplo, un valor 1 para indexar en orden ascendente o un valor -1 para indexar en orden descendente.
Por ejemplo:
{"id":"1", "product":"chips", "manufacturer":"lays", "price":20} {"id":"2", "product":"pringles", "manufacturer":"Kellogg's", "price":99} {"id":"3", "product":"Doritos", "manufacturer":"lays", "price":10} {"id":"4", "product":"cheetos", "manufacturer":"lays", "price":473} {"id":"5", "product":"coldrink", "manufacturer":"mountain-dew", "price":20}
En los cuatro documentos anteriores, podemos indexarlos tanto por el nombre del campo como por la antigüedad en cualquier orden. Supongamos que creamos un índice compuesto por db.collection.createIndex(fabricante:1, precio:-1) entonces el índice se verá así
Como se muestra en la imagen, primero Kellogs, Lays y mountain-dew se ordenan alfabéticamente, y luego los precios se ordenan dentro de ellos. Aquí, la indexación se realizará primero en orden ascendente del nombre del fabricante y, luego, la indexación se realizará en orden descendente según el precio. Entonces podemos ejecutar consultas como db.collection.find().sort(fabricante:1, precio: -1) de manera eficiente ya que hemos creado un índice para eso.
Ejemplos –
En los siguientes ejemplos, estamos trabajando con:
Base de datos: GeeksforGeeks
Colección: productos
Documentos: Seis documentos que contienen los datos de los empleados en forma de pares campo-valor.
Creación de un índice compuesto de fabricación y precio:
Aquí estamos creando un índice sobre la fabricación en orden ascendente y luego sobre el precio en orden descendente.
db.products.createIndex({manufacturer:1, price:-1})
Creación de un índice compuesto de producto, fabricante y precio:
Aquí estamos creando un índice sobre el producto en orden ascendente, luego se ordenará por fabricante en orden ascendente y luego se ordenará nuevamente por precio
db.products.createIndex({product:1,manufacturer:1,price:1})
Clasificación usando índices compuestos
Podemos usar la función sort() de MongoDB en el índice creado, ya que los índices contienen registros ordenados, MongoDB puede obtener los resultados de una ordenación de un índice con el cual hay coincidencias de expresión de ordenación (coincidencia con prefijo). Si MongoDB no puede usar un índice para obtener el orden de clasificación, realiza una operación de clasificación de bloqueo en los datos en los que consume y procesa todos los documentos de entrada para la clasificación antes de devolver los resultados.
Si las claves de ordenación coinciden con un prefijo de índice, MongoDB puede usar el índice para ordenar los resultados de la consulta. Un prefijo es un subconjunto que consta de una o más claves del patrón de clave de índice.
Por ejemplo, supongamos que creamos un índice compuesto por
db.data.createIndex({a:1, b: -1, c:1})
Luego tenemos los siguientes prefijos en los que se usa nuestro índice creado para ordenar:
{a:1} {a:1,b:-1} {a:1,b-1,c:1}
Ejemplo |
prefijo |
---|---|
db.data.find().sort({a: 1}) |
{un: 1} |
db.data.find().sort({a: -1}) |
{un: 1} |
db.data.find().sort({a: 1, b: -1}) |
{a: 1, b: -1} |
db.data.find().sort({a: -1, b: 1}) |
{a: 1, b: -1} |
db.data.find().sort({a: 1, b: -1, c: 1}) |
{a: 1, b: -1, c: 1} |
Entonces, para todos los ejemplos en la tabla anterior, MongoDB usará nuestro índice creado pero no en db.data.find().sort({a: -1, b: -1}) o db.data.find().sort ({a: 1, b: 1}), ya que no coinciden con ningún prefijo para estos dos, MongoDB tiene que realizar una clasificación de bloqueo.
También podemos usar sin prefijo como {b: -1, c: 1} para ordenar, pero para esto, tenemos que poner la igualdad en la clave de prefijo anterior, por ejemplo.
db.data.find({a: 6}).sort({b: -1, c: 1})
Aquí hemos puesto una condición de igualdad en la tecla ‘a’ y ahora usará el prefijo {a: 1, b: -1, c: 1}
Ejemplo:
db.products.find().sort({manufacturer:1,price:-1})
En el ejemplo anterior, dado que nuestro patrón de clave de clasificación tiene fabricación: 1, precio: -1, que es similar a la segunda clave de índice fabricación_1_precio_-1, por lo tanto, este índice se usará para obtener el resultado en lugar de ordenar nuevamente.
Publicación traducida automáticamente
Artículo escrito por darksiderrohan y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA