I MongoDB er db.collection.unhideIndex()
metode viser et skjult indeks.
Et skjult indeks er et, der er skjult fra forespørgselsplanlæggeren. Når du viser et indeks, er det ikke længere skjult for forespørgselsplanlæggeren, og det er umiddelbart tilgængeligt til brug.
Eksempel
Antag, at vi har en samling kaldet pets
, og vi vil gerne tjekke det for skjulte indekser. Vi kunne køre følgende forespørgsel for at returnere alle indekser på samlingen:
db.pets.getIndexes()
Resultat:
[ { "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 } ]
Vi kan se, at der er tre indekser. Den tredje er skjult. Vi ved det, fordi den har "hidden" : true
.
Det indeks er på weight
Mark. Når vi kører en forespørgsel gennem forespørgselsplanen, spørger vi efter weight
felt, vil vi se, at den ikke bruger indekset.
Eksempel:
db.pets.find( { weight: { $gt: 10 } } ).explain()
Resultat:
{ "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 }
Vi kan se, at den lavede en COLLSCAN
(en samlingsscanning), hvilket betyder, at den ikke brugte indekset.
Vis indekset
Vi kan bruge unhideIndex()
metode til at vise indekset. Denne metode accepterer navnet på indekset eller dets nøglemønster som en parameter for at angive, hvilket indeks der skal vises.
Eksempel:
db.pets.unhideIndex("idx_weight_-1")
Output:
{ "hidden_old" : true, "hidden_new" : false, "ok" : 1 }
Outputtet af unhideIndex()
metoden viser den gamle værdi for hidden
felt (i dette tilfælde true
) og den nye værdi (i dette tilfælde false
).
Men hvis vi viser et allerede skjult indeks (eller skjuler et allerede skjult), vises disse ikke, og vi får bare følgende:
{ "ok" : 1 }
Uanset hvad er indekset nu skjult.
Tjek forespørgselsplanen igen
Lad os køre den forrige forespørgsel igen for at se, hvordan forespørgselsplanen ser ud nu.
db.pets.find( { weight: { $gt: 10 } } ).explain()
Resultat:
{ "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 }
Vi kan se, at den brugte IXSCAN
, hvilket betyder, at den brugte indekset.
Tjek, om indekset er blevet skjult
Vi kan bruge getIndexes()
metode igen for at kontrollere, om indekset er blevet vist eller ej.
db.pets.getIndexes()
Resultat:
[ { "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" } ]
Vi ser de samme tre indekser, som vi så i det tidligere eksempel, men denne gang ser vi ikke "hidden" : true
.
Men vi ser heller ikke "hidden" : false
.
Visning af et indeks fjerner simpelthen "hidden" : true
del fra resultatet af getIndexes()
. Den hidden
indstillingen er kun tilgængelig, hvis værdien er true
. Den hidden
option er en boolesk værdi, så vi kan derfor udlede, at hvis den ikke er "hidden" : true
, så er det "hidden" : false
.
Kan du ikke skjule/vise indekser? Tjek denne indstilling.
mongod
featureCompatibilityVersion
skal være mindst 4.4
før du kan skjule indekser. Men når et indeks først er skjult, forbliver det skjult selv med featureCompatibilityVersion
sat til 4.2 på MongoDB 4.4 binære filer.
Du kan tjekke featureCompatibilityVersion
indstilling med følgende kode:
db.adminCommand(
{
getParameter: 1,
featureCompatibilityVersion: 1
}
)
Du kan indstille det ved hjælp af setFeatureCompatibilityVersion
kommando:
db.adminCommand( { setFeatureCompatibilityVersion: "4.4" } )
setFeatureCompatibilityVersion
kommandoen skal køres i admin
database.
Bemærk også, at du ikke kan skjule _id
indeks.