MongoDB permite la creación de índices en un campo o conjunto de campos para realizar consultas. Dado que MongoDB admite esquemas dinámicos, las aplicaciones pueden realizar consultas en campos cuyos nombres no se conocen de antemano o son arbitrarios.
Novedades en la versión MongoDB:4.2
MongoDB 4.2 introduce índices comodín para soportar queries sobre campos desconocidos o arbitrarios.
Considere una aplicación que captura datos definidos por el usuario bajo el
userMetadata campo y admite la consulta de esos datos:
{ "userMetadata" : { "likes" : [ "dogs", "cats" ] } } { "userMetadata" : { "dislikes" : "pickles" } } { "userMetadata" : { "age" : 45 } } { "userMetadata" : "inactive" }
Los administradores desean crear índices para admitir consultas en cualquier subcampo de userMetadata.
Un índice comodín en userMetadata puede admitir consultas de campo único en userMetadata, userMetadata.likes, userMetadata.dislikes y userMetadata.age:
db.userData.createIndex( { "userMetadata.$**" : 1 } )
El índice puede admitir las siguientes consultas:
db.userData.find({ "userMetadata.likes" : "dogs" }) db.userData.find({ "userMetadata.dislikes" : "pickles" }) db.userData.find({ "userMetadata.age" : { $gt : 30 } }) db.userData.find({ "userMetadata" : "inactive" })
Un índice no comodín en userMetadata solo puede admitir consultas en valores de userMetadata.
Importante
Los índices comodín no están diseñados para reemplazar la planificación de índices basada en la carga de trabajo. Para obtener más información sobre la creación de índices para admitir consultas, consulte Cree índices para respaldar sus consultas. Para obtener documentación completa sobre las limitaciones de los índices comodín, consulte Restricciones de índices comodín.
Crear índice comodín
Importante
La mongod versión de compatibilidad de características debe ser 4.2 para crear índices comodín. Para obtener instrucciones sobre cómo configurar fCV, consulte "Establecer la versión de compatibilidad de características en 6.0 las implementaciones de MongoDB ".
Puede crear índices comodín utilizando el createIndexes comando de base de datos o sus ayudantes de shell, createIndex() o.createIndexes()
Crear un índice comodín en un campo
Para indexar el valor de un campo específico:
db.collection.createIndex( { "fieldA.$**" : 1 } )
Con este índice comodín, MongoDB indexa todos los valores de fieldA. Si el campo es un documento o una matriz anidada, el índice comodín se recurre al documento o la matriz y almacena el valor de todos sus campos.
Por ejemplo, los documentos de la colección product_catalog pueden contener un campo product_attributes. El campo product_attributes puede contener campos anidados arbitrarios, incluyendo documentos y matrices incrustados:
{ "product_name" : "Spy Coat", "product_attributes" : { "material" : [ "Tweed", "Wool", "Leather" ] "size" : { "length" : 72, "units" : "inches" } } } { "product_name" : "Spy Pen", "product_attributes" : { "colors" : [ "Blue", "Black" ], "secret_feature" : { "name" : "laser", "power" : "1000", "units" : "watts", } } }
La siguiente operación crea un índice comodín en el campo product_attributes:
db.products_catalog.createIndex( { "product_attributes.$**" : 1 } )
El índice comodín puede admitir consultas arbitrarias de un solo campo en product_attributes o en sus campos incrustados:
db.products_catalog.find( { "product_attributes.size.length" : { $gt : 60 } } ) db.products_catalog.find( { "product_attributes.material" : "Leather" } ) db.products_catalog.find( { "product_attributes.secret_feature.name" : "laser" } )
Nota
La sintaxis del índice comodín específico de la ruta es incompatible con la opción. Consulte wildcardProjection las opciones para wildcard índices para obtener más información.
Para ver un ejemplo, consulte Crear un índice comodín en una ruta de campo único.
Crea un índice comodín en todos los campos
Para indexar el valor de todos los campos de un documento (excluyendo _id), especifique "$**" como clave de índice:
db.collection.createIndex( { "$**" : 1 } )
Con este índice comodín, MongoDB indexa todos los campos de cada documento de la colección. Si un campo es un documento o una matriz anidada, el índice comodín se recurre al documento o la matriz y almacena el valor de todos sus campos.
Para ver un ejemplo, consulte Crear un índice comodín en todas las rutas de campo.
Nota
Los índices comodín omiten el _id campo de forma predeterminada. Para incluir el _id campo en el índice comodín, debe incluirlo explícitamente en el wildcardProjection documento. Consulte Opciones para wildcard índices para obtener más información.
Crear un índice comodín en varios campos específicos
Para indexar los valores de varios campos específicos en un documento:
db.collection.createIndex( { "$**" : 1 }, { "wildcardProjection" : { "fieldA" : 1, "fieldB.fieldC" : 1 } } )
Con este índice comodín, MongoDB indexa todos los valores de los campos especificados para cada documento de la colección. Si un campo es un documento o una matriz anidada, el índice comodín se recurre al documento o la matriz y almacena el valor de todos sus campos.
Nota
Los índices comodín no admiten la combinación de declaraciones de inclusión y exclusión en el wildcardProjection documento,excepto cuando se incluye explícitamente el _id campo. Para obtener más información wildcardProjection sobre, consulte las Opciones para wildcard índices.
Para ver un ejemplo, consulte Incluir campos específicos en la cobertura del índice comodín.
Crear un índice comodín que excluya varios campos específicos
Para indexar los campos de todos los campos de un documento excluyendo rutas de campos específicos:
db.collection.createIndex( { "$**" : 1 }, { "wildcardProjection" : { "fieldA" : 0, "fieldB.fieldC" : 0 } } )
Con este índice comodín, MongoDB indexa todos los campos de cada documento de la colección,excluyendo las rutas de campo especificadas. Si un campo es un documento o una matriz anidada, el índice comodín se recurre al documento o la matriz y almacena los valores de todos sus campos.
Para ver un ejemplo, consulte Omitir campos específicos de la cobertura del índice comodín.
Nota
Los índices comodín no admiten la combinación de declaraciones de inclusión y exclusión en el wildcardProjection documento,excepto cuando se incluye explícitamente el _id campo. Para obtener más información wildcardProjection sobre, consulte las Opciones para wildcard índices.
Considerations
Los índices comodín admiten como máximo un campo en cualquier predicado de consulta. Para obtener más información sobre la compatibilidad con consultas de índices comodín, consulte Compatibilidad con consultas y ordenación de índices comodín.
La
mongodversión de compatibilidad de características debe ser4.2para crear índices comodín. Para obtener instrucciones sobre cómo configurar fCV, consulte "Establecer la versión de compatibilidad de características en 6.0 las implementaciones de MongoDB ".Los índices comodín omiten el campo _id por defecto. Para incluir el campo
_iden el índice comodín, debe incluirlo explícitamente en el documento wildcardProjection (es decir, ({ "_id" : 1 }).Puedes crear múltiples índices comodín en una colección.
Un índice comodín puede cubrir los mismos campos que otros índices de la colección.
Los índices comodín son índices dispersos y solo contienen entradas para documentos que tienen el campo indexado, incluso si el campo de índice contiene un valor nulo.
Comportamiento
Los índices comodín tienen un comportamiento específico al indexar campos que son un objeto (es decir, un documento incrustado) o una matriz:
Si el campo es un objeto, el índice comodín desciende hasta el objeto e indexa su contenido. El índice comodín continúa descendiendo hasta cualquier documento incrustado adicional que encuentre.
Si el campo es una matriz, entonces el índice comodín recorre la matriz e indexa cada elemento:
Si un elemento de la matriz es un objeto, el índice comodín desciende hasta el objeto para indexar su contenido como se describe anteriormente.
Si el elemento es una matriz (es decir, una matriz que está incrustada directamente dentro de la matriz principal), entonces el índice comodín no recorre la matriz incrustada, sino que indexa toda la matriz como un único valor.
Para todos los demás campos, registre el valor primitivo (no objeto/matriz) en el índice.
El índice comodín continúa recorriendo cualquier objeto o matriz anidada adicional hasta alcanzar un valor primitivo (es decir, un campo que no es un objeto ni una matriz). A continuación, indexa este valor primitivo junto con la ruta completa a dicho campo.
Por ejemplo, considere el siguiente documento:
{ "parentField" : { "nestedField" : "nestedValue", "nestedObject" : { "deeplyNestedField" : "deeplyNestedValue" }, "nestedArray" : [ "nestedArrayElementOne", [ "nestedArrayElementTwo" ] ] } }
Un índice comodín que incluye parentField registra las siguientes entradas:
"parentField.nestedField" : "nestedValue""parentField.nestedObject.deeplyNestedField" : "deeplyNestedValue""parentField.nestedArray" : "nestedArrayElementOne""parentField.nestedArray" : ["nestedArrayElementTwo"]
Tenga en cuenta que los registros de parentField.nestedArray no incluyen la posición de cada elemento en el array. Los índices comodín ignoran la posición de los elementos del array al registrarlos en el índice. Sin embargo, los índices comodín admiten consultas que incluyan índices de array explícitos. Consulte Consultas con índices de array explícitos para obtener más información.
Para obtener más información sobre el comportamiento del índice comodín con objetos anidados, consulte Objetos anidados.
Para obtener más información sobre el comportamiento del índice comodín con matrices anidadas, consulte Matrices anidadas.
Objetos anidados
Cuando un índice comodín encuentra un objeto anidado, desciende hasta el objeto e indexa su contenido. Por ejemplo:
{ "parentField" : { "nestedField" : "nestedValue", "nestedArray" : ["nestedElement"] "nestedObject" : { "deeplyNestedField" : "deeplyNestedValue" } } }
Un índice comodín que incluye parentField desciende al objeto para recorrer e indexar su contenido:
Para cada campo que sea en sí mismo un objeto (es decir, un documento incrustado), descienda al objeto para indexar su contenido.
Para cada campo que sea una matriz, recorra la matriz e indexe su contenido.
Para todos los demás campos, registre el valor primitivo (no objeto/matriz) en el índice.
El índice comodín continúa recorriendo cualquier objeto o matriz anidada adicional hasta alcanzar un valor primitivo (es decir, un campo que no es un objeto ni una matriz). A continuación, indexa este valor primitivo junto con la ruta completa a dicho campo.
Dado el documento de muestra, el índice comodín agrega los siguientes registros al índice:
"parentField.nestedField" : "nestedValue""parentField.nestedObject.deeplyNestedField" : "deeplyNestedValue""parentField.nestedArray" : "nestedElement"
Para obtener más información sobre el comportamiento del índice comodín con matrices anidadas, consulte Matrices anidadas.
Arreglos anidados
Cuando un índice comodín encuentra una matriz anidada, intenta recorrerla para indexar sus elementos. Si la matriz es a su vez un elemento de una matriz principal (es decir, una matriz incrustada), el índice comodín registra la matriz completa como valor en lugar de recorrer su contenido. Por ejemplo:
{ "parentArray" : [ "arrayElementOne", [ "embeddedArrayElement" ], "nestedObject" : { "nestedArray" : [ "nestedArrayElementOne", "nestedArrayElementTwo" ] } ] }
Un índice comodín que incluye parentArray desciende a la matriz para recorrer e indexar su contenido:
Para cada elemento que sea una matriz (es decir, una matriz incrustada), indexe toda la matriz como un valor.
Para cada elemento que sea un objeto, descienda en el objeto para recorrer e indexar su contenido.
Para todos los demás campos, registre el valor primitivo (no objeto/matriz) en el índice.
El índice comodín continúa recorriendo cualquier objeto o matriz anidada adicional hasta alcanzar un valor primitivo (es decir, un campo que no es un objeto ni una matriz). A continuación, indexa este valor primitivo junto con la ruta completa a dicho campo.
Dado el documento de muestra, el índice comodín agrega los siguientes registros al índice:
"parentArray" : "arrayElementOne""parentArray" : ["embeddedArrayElement"]"parentArray.nestedObject.nestedArray" : "nestedArrayElementOne""parentArray.nestedObject.nestedArray" : "nestedArrayElementTwo"
Tenga en cuenta que los registros de parentField.nestedArray no incluyen la posición de cada elemento en el array. Los índices comodín ignoran la posición de los elementos del array al registrarlos en el índice. Sin embargo, los índices comodín admiten consultas que incluyan índices de array explícitos. Consulte Consultas con índices de array explícitos para obtener más información.
Index Display
A partir de MongoDB 6.3, 6.0.5 y 5.0.16, el campo wildcardProjection almacena la proyección del índice en su forma presentada. Las versiones anteriores del servidor podrían haber almacenado la proyección en una forma normalizada.
El servidor utiliza el índice de la misma manera, pero es posible que notes una diferencia en la salida de los comandos listIndexes db.collection.getIndexes() y.
Restricciones
No se puede fragmentar una colección con un índice comodín. Cree un índice sin comodín en el campo o los campos que desee fragmentar. Para obtener más información sobre la selección de claves de fragmentación, consulte Claves de fragmentación.
No se pueden especificar las siguientes propiedades para un índice comodín:
No se pueden crear los siguientes tipos de índice utilizando la sintaxis de comodines:
Importante
Los índices comodín son distintos de los índices de texto comodín y son incompatibles con ellos. No admiten consultas con el $text operador.
Para obtener documentación completa sobre las restricciones de creación de índices comodín, consulte Tipos o propiedades de índices incompatibles.
Compatibilidad con consultas y ordenamiento de índices comodín
Consultas cubiertas
Los índices comodín pueden admitir una consulta cubierta solo si se cumplen todas las siguientes condiciones:
El planificador de consultas selecciona el índice comodín para satisfacer el predicado de la consulta.
El predicado de la query especifica exactamente un campo cubierto por el índice comodín.
La proyección excluye explícitamente
_ide incluye solo el campo de consulta.El campo de query especificado nunca es un arreglo.
Observa el siguiente índice comodín de la colección employees:
db.employees.createIndex( { "$**" : 1 } )
La siguiente operación realiza una query para un único campo lastName y proyecta todos los demás campos del documento resultante:
db.employees.find( { "lastName" : "Doe" }, { "_id" : 0, "lastName" : 1 } )
Suponiendo que el lastName especificado nunca es una matriz, MongoDB puede usar el índice comodín $** para soportar una consulta cubierta.
Predicados de consulta de múltiples campos
Los índices comodín admiten como máximo un campo de predicado de consulta. Es decir:
MongoDB no puede utilizar un índice no comodín para satisfacer una parte de un predicado de consulta y un índice comodín para satisfacer otra.
MongoDB no puede utilizar un índice comodín para satisfacer una parte de un predicado de consulta y otro índice comodín para satisfacer otra.
Aunque un único índice comodín admita varios campos de consulta, MongoDB puede usarlo para admitir solo uno de ellos. Los demás campos se resuelven sin índice.
Sin embargo, MongoDB puede utilizar el mismo índice comodín para satisfacer cada argumento independiente de los operadores $or de consulta $or o de agregación.
Las query con ordenación
MongoDB puede usar un índice comodín para satisfacer sort() solo si se cumplen todas las siguientes condiciones:
El planificador de consultas selecciona el índice comodín para satisfacer el predicado de la consulta.
El
sort()especifica solo el campo del predicado de la query.El campo especificado nunca es una matriz.
Si no se cumplen las condiciones anteriores, MongoDB no puede usar el índice comodín para la ordenación. MongoDB no admite operaciones que requieran un índice diferente al del predicado de la consulta. Para obtener más información,sort() consulte Intersección de índices y ordenación.
Observa el siguiente índice comodín de la colección products:
db.products.createIndex( { "product_attributes.$**" : 1 } )
La siguiente operación consulta un solo campo product_attributes.price y ordena según ese mismo campo:
db.products.find( { "product_attributes.price" : { $gt : 10.00 } }, ).sort( { "product_attributes.price" : 1 } )
Suponiendo que el especificado price nunca es una matriz, MongoDB puede usar el product_attributes.$** índice comodín para satisfacer tanto el find() como sort() el.
Patrones de consulta no admitidos
Los índices comodín no pueden admitir los siguientes patrones de consulta:
Consultas que comprueban si un campo no existe
Consultas que comprueban si un campo es o no igual a un documento o una matriz
Consultas que comprueban si un campo es igual a null
Para obtener más detalles,consulte Patrones de consulta y agregación no admitidos.
Consultas con índices de matriz explícitos
Los índices comodín de MongoDB no registran la posición de un arreglo de ningún elemento dado en un arreglo durante la indexación. Sin embargo, MongoDB aún puede seleccionar el índice comodín para responder una query que incluya una ruta de campo con uno o más índices explícitos de arreglo (por ejemplo parentArray.0.nestedArray.0). Debido a la creciente complejidad de definir los límites del índice para cada arreglo anidado consecutivo, MongoDB no considera el índice comodín para responder una ruta de campo dada en la query si esa ruta contiene más de 8 índices explícitos de arreglo. MongoDB aún puede considerar el índice de comodín para responder otras rutas de campo en la query.
Por ejemplo:
{ "parentObject" : { "nestedArray" : [ "elementOne", { "deeplyNestedArray" : [ "elementTwo" ] } ] } }
MongoDB puede seleccionar un índice comodín que incluya parentObject para satisfacer las siguientes consultas:
"parentObject.nestedArray.0" : "elementOne""parentObject.nestedArray.1.deeplyNestedArray.0" : "elementTwo"
Si una ruta de campo dada en el predicado de consulta especifica más de 8 índices de matriz explícitos, MongoDB no considera el índice comodín para responder a esa ruta. En su lugar, MongoDB selecciona otro índice válido para responder a la consultao realiza un escaneo de la colección.
Tenga en cuenta que los índices comodín no tienen límites en la profundidad con la que recorren un documento al indexarlo; esta limitación solo se aplica a consultas que especifican explícitamente índices de matriz exactos. Al ejecutar las mismas consultas sin los índices de matriz explícitos, MongoDB puede seleccionar el índice comodín para responder a la consulta:
"parentObject.nestedArray" : "elementOne""parentObject.nestedArray.deeplyNestedArray" : "elementTwo"