No MongoDB, o
db.collection.unhideIndex()
O método exibe um índice oculto. Um índice oculto é aquele que está oculto do planejador de consultas. Quando você exibe um índice, ele não fica mais oculto do planejador de consulta e fica imediatamente disponível para uso.
Exemplo
Suponha que tenhamos uma coleção chamada
pets
, e queremos verificar se há índices ocultos. Poderíamos executar a seguinte consulta para retornar todos os índices da coleção: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 existem três índices. O terceiro está escondido. Sabemos disso, porque tem
"hidden" : true
. Esse índice está no
weight
campo. Quando executamos uma consulta por meio do plano de consulta que consulta o weight
campo, veremos que ele não usa o índice. Exemplo:
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 ele fez um
COLLSCAN
(uma varredura de coleção), o que significa que não usou o índice. Reexibir o índice
Podemos usar o
unhideIndex()
método para exibir o índice. Esse método aceita o nome do índice ou seu padrão de chave como um parâmetro para especificar qual índice exibir. Exemplo:
db.pets.unhideIndex("idx_weight_-1")
Saída:
{ "hidden_old" : true, "hidden_new" : false, "ok" : 1 }
A saída do
unhideIndex()
método exibe o valor antigo para o hidden
campo (neste caso true
) e o novo valor (neste caso false
). No entanto, se exibirmos um índice já não oculto (ou ocultar um já oculto), eles não serão exibidos e obteremos apenas o seguinte:
{ "ok" : 1 }
Independentemente disso, o índice agora é reexibido.
Verifique novamente o plano de consulta
Vamos executar novamente a consulta anterior para ver como está o plano de consulta agora.
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 ele usou
IXSCAN
, o que significa que ele usou o índice. Verifique se o índice foi reexibido
Podemos usar o
getIndexes()
método novamente para verificar se o índice foi ou não reexibido. 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 os mesmos três índices que vimos no exemplo anterior, mas desta vez não vemos
"hidden" : true
. Mas também não vemos
"hidden" : false
. Reexibir um índice simplesmente remove o
"hidden" : true
parte do resultado de getIndexes()
. O hidden
a opção só está disponível se o valor for true
. O hidden
option é um valor booleano, portanto, podemos inferir que, se não for "hidden" : true
, então é "hidden" : false
. Não é possível ocultar/exibir índices? Verifique esta configuração.
O
mongod
featureCompatibilityVersion
deve ser pelo menos 4.4
antes que você possa ocultar índices. No entanto, uma vez oculto, um índice permanecerá oculto mesmo com featureCompatibilityVersion
definido como 4.2 nos binários do MongoDB 4.4. Você pode verificar a
featureCompatibilityVersion
configuração com o seguinte código:db.adminCommand(
{
getParameter: 1,
featureCompatibilityVersion: 1
}
)
Você pode configurá-lo usando o
setFeatureCompatibilityVersion
comando:db.adminCommand( { setFeatureCompatibilityVersion: "4.4" } )
A
setFeatureCompatibilityVersion
comando precisa ser executado no admin
base de dados. Observe também que você não pode ocultar o
_id
índice.