Cuando creas un índice comodín, puedes especificar los campos que se incluirán o excluirán en el índice. Esto te permite hacer lo siguiente:
Crea un índice comodín que solo cubra campos específicos. Por ejemplo, si tienes varios documentos incrustados con múltiples subcampos, puedes crear un índice para cubrir queries tanto en documentos incrustados como en sus subcampos.
Crea un índice comodín que omita campos específicos. Por ejemplo, si tienes una colección que contiene un campo que nunca se query, puedes omitir ese campo del índice.
Para incluir o excluir campos en un índice comodín, especifica los campos elegidos en el wildcardProjection opción:
db.<collection>.createIndex( { "$**" : <sortOrder> }, { "wildcardProjection" : { "<field1>" : < 0 | 1 >, "<field2>" : < 0 | 1 >, ... "<fieldN>" : < 0 | 1 > } } )
En el documento wildcardProjection, el valor 0 o 1 indica si el campo está incluido o excluido en el índice:
0significa que el campo está excluido.1significa que el campo está incluido.
Restricciones
Para utilizar la opción
wildcardProjection, la clave del índice debe ser$**.Los índices comodín no admiten mezclar instrucciones de inclusión y exclusión en el documento
wildcardProjection, excepto cuando se incluye explícitamente el campo_id. Por ejemplo:El siguiente documento
wildcardProjectiones inválido porque especifica tanto una inclusión como una exclusión de un campo:{ "wildcardProjection" : { "attributes" : 0, "users" : 1 } } El siguiente documento
wildcardProjectiones válido porque, aunque especifica tanto inclusión como exclusión, incluye el campo_id:{ "wildcardProjection" : { "attributes" : 0, "_id" : 1 } }
Antes de comenzar
Creá una colección products que contenga los siguientes documentos:
db.products.insertMany( [ { "item": "t-shirt", "price": "29.99", "attributes": { "material": "cotton", "color": "blue", "size": { "units": "cm", "length": 74 } } }, { "item": "milk", "price": "3.99", "attributes": { "sellBy": "02-06-2023", "type": "oat" } }, { "item": "laptop", "price": "339.99", "attributes": { "memory": "8GB", "size": { "units": "inches", "height": 10, "width": 15 } } } ] )
Cada documento tiene un campo attributes que contiene detalles del producto. Los subcampos de attributes varían dependiendo del producto.
Procedimientos
Puedes usar la opción wildcardProjection para:
Incluir campos específicos en un índice comodín
Si consultas con frecuencia ciertos campos de documentos, puedes especificar esos campos en un wildcardProjection para respaldar esas consultas sin añadir un exceso innecesario al índice.
La siguiente operación crea un índice comodín que contiene todos los valores escalares (cadenas de texto y números) de los campos attributes.size y attributes.color:
db.products.createIndex( { "$**" : 1 }, { "wildcardProjection" : { "attributes.size" : 1, "attributes.color" : 1 } } )
Resultados
Si bien el patrón clave "$**" cubre todos los campos del documento, el campo wildcardProjection limita el índice solo a los campos incluidos.
Si un campo es un documento incrustado o un arreglo (como attributes.size), el índice comodín recurre en el campo e indexa todos los valores de campos escalares incrustados.
El índice creado soporta queries sobre cualquier valor escalar incluido en el objeto wildcardProjection. Por ejemplo, el índice admite estas queries:
db.products.find( { "attributes.size.height" : 10 } ) db.products.find( { "attributes.color" : "blue" } )
El índice solo admite consultas sobre los campos incluidos en el objeto wildcardProjection. En este ejemplo, MongoDB realiza un escaneo de colección para la siguiente query porque incluye un campo que no está presente en el objeto wildcardProjection:
db.products.find ( { "item": "milk" } )
Excluir campos específicos de un índice comodín
Si hay campos de documentos que rara vez query, puedes crear un índice comodín que omita esos campos.
La siguiente operación crea un índice comodín en todos los campos de documentos de la colección products, pero omite el campo attributes.memory del índice:
db.products.createIndex( { "$**" : 1 }, { "wildcardProjection" : { "attributes.memory" : 0 } } )
Resultados
Si bien el patrón clave "$**" cubre todos los campos en el documento, el campo wildcardProjection excluye los valores attributes.memory del índice.
Si un campo es un documento incrustado o un arreglo (como attributes.size), el índice comodín recurre en el campo e indexa todos los valores de campos escalares incrustados.
Por ejemplo, el índice admite estos queries:
db.products.find( { "attributes.color" : "blue" } ) db.products.find( { "attributes.size.height" : 10 } )
El índice no admite queries sobre attributes.memory, porque ese campo se omitió en el índice.
Obtén más información
Para aprender a usar la proyección comodín con un índice comodín compuesto para filtro campos, consulta Filtrar campos con un wildcardProjection.
Para obtener más información sobre los comportamientos y casos de uso de los índices comodín, consulta: