In MongoDB, de db.collection.unhideIndex()
methode maakt een verborgen index zichtbaar.
Een verborgen index is een index die verborgen is voor de queryplanner. Wanneer u een index zichtbaar maakt, wordt deze niet langer verborgen voor de queryplanner en is deze onmiddellijk beschikbaar voor gebruik.
Voorbeeld
Stel dat we een verzameling hebben met de naam pets
, en we willen het controleren op verborgen indexen. We zouden de volgende query kunnen uitvoeren om alle indexen van de collectie te retourneren:
db.pets.getIndexes()
Resultaat:
[ { "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 } ]
We kunnen zien dat er drie indexen zijn. De derde is verborgen. We weten dat, want het heeft "hidden" : true
.
Die index staat op het weight
veld. Wanneer we een query uitvoeren via het queryplan dat het weight
. opvraagt veld, zullen we zien dat het de index niet gebruikt.
Voorbeeld:
db.pets.find( { weight: { $gt: 10 } } ).explain()
Resultaat:
{ "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 }
We kunnen zien dat het een COLLSCAN
. heeft gedaan (een collectiescan), wat betekent dat het de index niet heeft gebruikt.
De index zichtbaar maken
We kunnen de unhideIndex()
. gebruiken methode om de index zichtbaar te maken. Deze methode accepteert de naam van de index of het sleutelpatroon als parameter om aan te geven welke index zichtbaar moet worden gemaakt.
Voorbeeld:
db.pets.unhideIndex("idx_weight_-1")
Uitgang:
{ "hidden_old" : true, "hidden_new" : false, "ok" : 1 }
De uitvoer van de unhideIndex()
methode geeft de oude waarde weer voor de hidden
veld (in dit geval true
) en de nieuwe waarde (in dit geval false
).
Als we echter een reeds niet-verborgen index zichtbaar maken (of een reeds verborgen index verbergen), worden deze niet weergegeven en krijgen we alleen het volgende:
{ "ok" : 1 }
Hoe dan ook, de index is nu zichtbaar.
Controleer het queryplan opnieuw
Laten we de vorige query opnieuw uitvoeren om te zien hoe het queryplan er nu uitziet.
db.pets.find( { weight: { $gt: 10 } } ).explain()
Resultaat:
{ "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 }
We kunnen zien dat het IXSCAN
. gebruikte , wat betekent dat het de index gebruikte.
Controleer of de index zichtbaar is gemaakt
We kunnen de getIndexes()
. gebruiken methode opnieuw om te controleren of de index al dan niet zichtbaar is gemaakt.
db.pets.getIndexes()
Resultaat:
[ { "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" } ]
We zien dezelfde drie indexen die we in het eerdere voorbeeld zagen, maar deze keer zien we niet "hidden" : true
.
Maar we zien ook niet "hidden" : false
.
Het zichtbaar maken van een index verwijdert eenvoudig de "hidden" : true
deel van het resultaat van getIndexes()
. De hidden
optie is alleen beschikbaar als de waarde true
is . De hidden
optie is een booleaanse waarde, dus we kunnen daarom afleiden dat als het niet "hidden" : true
, dan is het "hidden" : false
.
Kan indexen niet verbergen/weergeven? Vink deze instelling aan.
De mongod
featureCompatibilityVersion
moet minimaal 4.4
. zijn voordat u indexen kunt verbergen. Eenmaal verborgen, blijft een index echter verborgen, zelfs met featureCompatibilityVersion
ingesteld op 4.2 op MongoDB 4.4 binaire bestanden.
U kunt de featureCompatibilityVersion
. controleren instelling met de volgende code:
db.adminCommand(
{
getParameter: 1,
featureCompatibilityVersion: 1
}
)
U kunt het instellen met behulp van de setFeatureCompatibilityVersion
commando:
db.adminCommand( { setFeatureCompatibilityVersion: "4.4" } )
De setFeatureCompatibilityVersion
commando moet worden uitgevoerd in de admin
database.
Merk ook op dat u de _id
. niet kunt verbergen index.