En MongoDB, el db.collection.unhideIndex()
El método muestra un índice oculto.
Un índice oculto es uno que está oculto del planificador de consultas. Cuando muestra un índice, ya no está oculto para el planificador de consultas y está disponible de inmediato para su uso.
Ejemplo
Supongamos que tenemos una colección llamada pets
, y queremos verificar si hay índices ocultos. Podríamos ejecutar la siguiente consulta para devolver todos los índices de la colección:
db.pets.getIndexes()
Resultado:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "name" : 1, "type" : -1 }, "name" : "idx_name_1_type_-1" }, { "v" : 2, "key" : { "weight" : -1 }, "name" : "idx_weight_-1", "hidden" : true } ]
Podemos ver que hay tres índices. El tercero está oculto. Lo sabemos porque tiene "hidden" : true
.
Ese índice está en el weight
campo. Cuando ejecutamos una consulta a través del plan de consulta que consulta el weight
campo, veremos que no usa el índice.
Ejemplo:
db.pets.find( { weight: { $gt: 10 } } ).explain()
Resultado:
{ "queryPlanner" : { "plannerVersion" : 1, "namespace" : "PetHouse.pets", "indexFilterSet" : false, "parsedQuery" : { "weight" : { "$gt" : 10 } }, "queryHash" : "CEB852E7", "planCacheKey" : "851FBDB5", "winningPlan" : { "stage" : "COLLSCAN", "filter" : { "weight" : { "$gt" : 10 } }, "direction" : "forward" }, "rejectedPlans" : [ ] }, "ok" : 1 }
Podemos ver que hizo un COLLSCAN
(una exploración de colección), lo que significa que no usó el índice.
Mostrar el índice
Podemos usar el unhideIndex()
método para mostrar el índice. Este método acepta el nombre del índice o su patrón clave como parámetro para especificar qué índice mostrar.
Ejemplo:
db.pets.unhideIndex("idx_weight_-1")
Salida:
{ "hidden_old" : true, "hidden_new" : false, "ok" : 1 }
La salida de unhideIndex()
El método muestra el valor antiguo de hidden
campo (en este caso true
) y el nuevo valor (en este caso false
).
Sin embargo, si mostramos un índice que ya no está oculto (u ocultamos uno que ya está oculto), estos no se muestran y solo obtenemos lo siguiente:
{ "ok" : 1 }
Independientemente, el índice ahora no está oculto.
Vuelva a comprobar el plan de consulta
Volvamos a ejecutar la consulta anterior para ver cómo se ve el plan de consulta ahora.
db.pets.find( { weight: { $gt: 10 } } ).explain()
Resultado:
{ "queryPlanner" : { "plannerVersion" : 1, "namespace" : "PetHouse.pets", "indexFilterSet" : false, "parsedQuery" : { "weight" : { "$gt" : 10 } }, "queryHash" : "CEB852E7", "planCacheKey" : "851FBDB5", "winningPlan" : { "stage" : "FETCH", "inputStage" : { "stage" : "IXSCAN", "keyPattern" : { "weight" : -1 }, "indexName" : "idx_weight_-1", "isMultiKey" : false, "multiKeyPaths" : { "weight" : [ ] }, "isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 2, "direction" : "forward", "indexBounds" : { "weight" : [ "[inf.0, 10.0)" ] } } }, "rejectedPlans" : [ ] }, "ok" : 1 }
Podemos ver que usó IXSCAN
, lo que significa que usó el índice.
Comprobar si el índice no se ha ocultado
Podemos usar getIndexes()
de nuevo para comprobar si el índice se ha desocultado o no.
db.pets.getIndexes()
Resultado:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "name" : 1, "type" : -1 }, "name" : "idx_name_1_type_-1" }, { "v" : 2, "key" : { "weight" : -1 }, "name" : "idx_weight_-1" } ]
Vemos los mismos tres índices que vimos en el ejemplo anterior, pero esta vez no vemos "hidden" : true
.
Pero tampoco vemos "hidden" : false
.
Mostrar un índice simplemente elimina el "hidden" : true
parte del resultado de getIndexes()
. El hidden
la opción solo está disponible si el valor es true
. El hidden
option es un valor booleano, por lo que podemos inferir que si no es "hidden" : true
, entonces es "hidden" : false
.
¿No puede ocultar/mostrar índices? Compruebe esta configuración.
El mongod
featureCompatibilityVersion
debe ser al menos 4.4
antes de poder ocultar índices. Sin embargo, una vez oculto, un índice permanecerá oculto incluso con featureCompatibilityVersion
establecido en 4.2 en binarios MongoDB 4.4.
Puede consultar la featureCompatibilityVersion
configuración con el siguiente código:
db.adminCommand(
{
getParameter: 1,
featureCompatibilityVersion: 1
}
)
Puede configurarlo usando setFeatureCompatibilityVersion
comando:
db.adminCommand( { setFeatureCompatibilityVersion: "4.4" } )
setFeatureCompatibilityVersion
el comando debe ejecutarse en el admin
base de datos.
También tenga en cuenta que no puede ocultar el _id
índice.