V MongoDB, db.collection.unhideIndex() metoda odkryje skrytý index.
Skrytý index je index, který je skrytý před plánovačem dotazů. Když index odkryjete, nebude již skrytý před plánovačem dotazů a je okamžitě k dispozici k použití.
Příklad
Předpokládejme, že máme sbírku nazvanou pets a chceme v něm zkontrolovat skryté indexy. Mohli bychom spustit následující dotaz, abychom vrátili všechny indexy v kolekci:
db.pets.getIndexes() Výsledek:
[
{
"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
}
]
Vidíme, že existují tři indexy. Třetí je skrytý. Víme to, protože má "hidden" : true .
Tento index má weight pole. Když spustíme dotaz přes plán dotazů, který se dotazuje na weight pole, uvidíme, že nepoužívá index.
Příklad:
db.pets.find( { weight: { $gt: 10 } } ).explain() Výsledek:
{
"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
}
Vidíme, že to provedlo COLLSCAN (skenování kolekce), což znamená, že nepoužil index.
Zobrazení rejstříku
Můžeme použít unhideIndex() metoda k odkrytí indexu. Tato metoda přijímá název indexu nebo jeho klíčový vzor jako parametr pro určení, který index se má odkrýt.
Příklad:
db.pets.unhideIndex("idx_weight_-1") Výstup:
{ "hidden_old" : true, "hidden_new" : false, "ok" : 1 }
Výstup unhideIndex() metoda zobrazí starou hodnotu pro hidden pole (v tomto případě true ) a novou hodnotu (v tomto případě false ).
Pokud však odkryjeme již neskrytý index (nebo skryjeme již skrytý), tyto se nezobrazí a dostaneme pouze následující:
{ "ok" : 1 } Bez ohledu na to je index nyní nekrytý.
Znovu zkontrolujte plán dotazů
Spusťte znovu předchozí dotaz, abyste viděli, jak nyní vypadá plán dotazů.
db.pets.find( { weight: { $gt: 10 } } ).explain() Výsledek:
{
"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
}
Vidíme, že používá IXSCAN , což znamená, že použil index.
Zkontrolujte, zda byl index odkryt
Můžeme použít getIndexes() znovu zkontrolovat, zda byl index odkryt.
db.pets.getIndexes() Výsledek:
[
{
"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"
}
]
Vidíme stejné tři indexy, které jsme viděli v předchozím příkladu, ale tentokrát nevidíme "hidden" : true .
Ale také nevidíme "hidden" : false .
Odkrytí indexu jednoduše odstraní "hidden" : true část z výsledku getIndexes() . hidden možnost je dostupná pouze v případě, že je hodnota true . hidden option je booleovská hodnota, takže můžeme odvodit, že pokud to není "hidden" : true , pak je "hidden" : false .
Nelze skrýt/odkrýt indexy? Zkontrolujte toto nastavení.
mongod featureCompatibilityVersion musí být alespoň 4.4 než budete moci skrýt indexy. Jakmile je však index skrytý, zůstane skrytý i s featureCompatibilityVersion nastaveno na 4.2 na binárních souborech MongoDB 4.4.
Můžete zkontrolovat featureCompatibilityVersion nastavení pomocí následujícího kódu:
db.adminCommand(
{
getParameter: 1,
featureCompatibilityVersion: 1
}
)
Můžete jej nastavit pomocí setFeatureCompatibilityVersion příkaz:
db.adminCommand( { setFeatureCompatibilityVersion: "4.4" } )
setFeatureCompatibilityVersion příkaz je třeba spustit v admin databáze.
Pamatujte také, že nemůžete skrýt _id index.