¿Cómo puedo crear un índice compuesto en mongo donde uno de los campos puede no estar presente o ser nulo?
Por ejemplo, en los siguientes documentos si creo un índice compuesto nombre+edad. ¿Cómo puedo lograr esto si la edad no está presente o es nula en algunos documentos?
{ name: "Anurag", age: "21", }, { name: "Nitin", },Puede crear un índice parcial de la siguiente manera:
db.contacts.createIndex( { name: 1 }, { partialFilterExpression: { age: { $exists: true } } } )Explicado:
Según la documentación, los índices parciales solo indexan los documentos de una colección que cumplen una expresión de filtro especificada. Al indexar un subconjunto de los documentos de una colección, los índices parciales tienen requisitos de almacenamiento más bajos y costos de rendimiento reducidos para la creación y el mantenimiento de índices. En este caso particular, imagine que su colección tiene 100k documentos, pero solo 5 documentos tienen el campo "edad", en este caso, el índice parcial incluirá solo esos 5 campos en el índice, optimizando el espacio de almacenamiento del índice y brindando un mejor rendimiento.
Para que el optimizador de consultas elija este índice parcial, el predicado de la consulta debe incluir una condición en el campo de nombre, así como una coincidencia no nula en el campo de edad.
Las siguientes consultas de ejemplo podrán usar el índice:
db.contacts.find({name:"John"}) db.contacts.find({name:"John",age:{$gt:20}}) db.contacts.find({name:"John",age:30})La siguiente consulta de ejemplo es una "consulta cubierta" basada en este índice:
db.contacts.find({name:"John",age:30},{_id:0,name:1,age:1})(esta consulta será muy eficiente ya que devuelve los datos directamente desde el índice)
Las siguientes consultas de ejemplo no podrán usar el índice:
db.contacts.find({name:"John",age:{$exists:false}}) db.contacts.find({name:"John",age:null}) db.contacts.find({age:20})Tenga en cuenta que debe realizar un análisis si necesita buscar en el campo de edad junto con el nombre, ya que el campo de nombre tiene una muy buena selectividad y este índice no se utilizará en caso de que busque solo por edad, tal vez una buena La opción es crear un índice disperso/parcial adicional solo en el campo de edad para que pueda obtener una lista con contactos de cierta edad si este es un posible caso de uso de búsqueda.