In MongoDB, il db.collection.unhideIndex()
il metodo mostra un indice nascosto.
Un indice nascosto è nascosto dal pianificatore di query. Quando mostri un indice, questo non è più nascosto dal pianificatore di query ed è immediatamente disponibile per l'uso.
Esempio
Supponiamo di avere una collezione chiamata pets
e vogliamo controllarlo per gli indici nascosti. Potremmo eseguire la seguente query per restituire tutti gli indici sulla raccolta:
db.pets.getIndexes()
Risultato:
[ { "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 } ]
Possiamo vedere che ci sono tre indici. Il terzo è nascosto. Lo sappiamo, perché ha "hidden" : true
.
Quell'indice è sul weight
campo. Quando eseguiamo una query tramite il piano di query che interroga il weight
campo, vedremo che non utilizza l'indice.
Esempio:
db.pets.find( { weight: { $gt: 10 } } ).explain()
Risultato:
{ "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 }
Possiamo vedere che ha eseguito un COLLSCAN
(una scansione della raccolta), il che significa che non ha utilizzato l'indice.
Scopri l'indice
Possiamo usare unhideIndex()
metodo per mostrare l'indice. Questo metodo accetta il nome dell'indice o il relativo modello di chiave come parametro per specificare quale indice visualizzare.
Esempio:
db.pets.unhideIndex("idx_weight_-1")
Uscita:
{ "hidden_old" : true, "hidden_new" : false, "ok" : 1 }
L'output di unhideIndex()
il metodo mostra il vecchio valore per hidden
campo (in questo caso true
) e il nuovo valore (in questo caso false
).
Tuttavia, se mostriamo un indice già non nascosto (o ne nascondiamo uno già nascosto), questi non vengono visualizzati e otteniamo solo quanto segue:
{ "ok" : 1 }
Indipendentemente da ciò, l'indice ora non è nascosto.
Ricontrolla il piano delle query
Eseguiamo nuovamente la query precedente per vedere come appare ora il piano di query.
db.pets.find( { weight: { $gt: 10 } } ).explain()
Risultato:
{ "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 }
Possiamo vedere che utilizzava IXSCAN
, il che significa che ha utilizzato l'indice.
Verifica se l'indice è stato svelato
Possiamo usare getIndexes()
metodo di nuovo per verificare se l'indice è stato scoperto o meno.
db.pets.getIndexes()
Risultato:
[ { "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" } ]
Vediamo gli stessi tre indici che abbiamo visto nell'esempio precedente, ma questa volta non vediamo "hidden" : true
.
Ma non vediamo nemmeno "hidden" : false
.
La visualizzazione di un indice rimuove semplicemente il "hidden" : true
parte dal risultato di getIndexes()
. Il hidden
l'opzione è disponibile solo se il valore è true
. Il hidden
opzione è un valore booleano, quindi possiamo dedurre che se non è "hidden" : true
, quindi è "hidden" : false
.
Non riesci a nascondere/mostrare gli indici? Controlla questa impostazione.
Il mongod
featureCompatibilityVersion
deve essere almeno 4.4
prima di poter nascondere gli indici. Tuttavia, una volta nascosto, un indice rimarrà nascosto anche con featureCompatibilityVersion
impostato su 4.2 sui binari MongoDB 4.4.
Puoi controllare la featureCompatibilityVersion
impostazione con il seguente codice:
db.adminCommand(
{
getParameter: 1,
featureCompatibilityVersion: 1
}
)
Puoi impostarlo utilizzando setFeatureCompatibilityVersion
comando:
db.adminCommand( { setFeatureCompatibilityVersion: "4.4" } )
Il setFeatureCompatibilityVersion
il comando deve essere eseguito in admin
banca dati.
Nota inoltre che non puoi nascondere il _id
indice.