W MongoDB db.collection.unhideIndex() metoda odkrywa ukryty indeks.
Ukryty indeks to taki, który jest ukryty przed planerem zapytań. Gdy odkryjesz indeks, nie jest on już ukryty przed planerem zapytań i jest od razu dostępny do użycia.
Przykład
Załóżmy, że mamy kolekcję o nazwie pets i chcemy to sprawdzić pod kątem ukrytych indeksów. Moglibyśmy uruchomić następujące zapytanie, aby zwrócić wszystkie indeksy w kolekcji:
db.pets.getIndexes() Wynik:
[
{
"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
}
]
Widzimy, że istnieją trzy indeksy. Trzeci jest ukryty. Wiemy to, ponieważ ma "hidden" : true .
Ten indeks ma weight pole. Kiedy uruchamiamy zapytanie przez plan zapytań, który pyta o weight polu, zobaczymy, że nie używa indeksu.
Przykład:
db.pets.find( { weight: { $gt: 10 } } ).explain() Wynik:
{
"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
}
Widzimy, że wykonał COLLSCAN (skan kolekcji), co oznacza, że nie używał indeksu.
Odkryj indeks
Możemy użyć unhideIndex() metoda, aby odkryć indeks. Ta metoda akceptuje nazwę indeksu lub jego wzorzec klucza jako parametr określający indeks do odkrycia.
Przykład:
db.pets.unhideIndex("idx_weight_-1") Wyjście:
{ "hidden_old" : true, "hidden_new" : false, "ok" : 1 }
Wyjście unhideIndex() metoda wyświetla starą wartość dla hidden pole (w tym przypadku true ) i nową wartość (w tym przypadku false ).
Jeśli jednak odkryjemy już nieukryty indeks (lub ukryjemy już ukryty), nie są one wyświetlane i otrzymujemy tylko:
{ "ok" : 1 } Niezależnie od tego indeks jest teraz nieukryty.
Sprawdź ponownie plan zapytań
Uruchommy ponownie poprzednie zapytanie, aby zobaczyć, jak teraz wygląda plan zapytania.
db.pets.find( { weight: { $gt: 10 } } ).explain() Wynik:
{
"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
}
Widzimy, że użył IXSCAN , co oznacza, że użył indeksu.
Sprawdź, czy indeks został odkryty
Możemy użyć getIndexes() metodę ponownie, aby sprawdzić, czy indeks został odkryty.
db.pets.getIndexes() Wynik:
[
{
"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"
}
]
Widzimy te same trzy indeksy, które widzieliśmy we wcześniejszym przykładzie, ale tym razem nie widzimy "hidden" : true .
Ale nie widzimy też "hidden" : false .
Odkrycie indeksu po prostu usuwa "hidden" : true część z wyniku getIndexes() . hidden opcja jest dostępna tylko wtedy, gdy wartość to true . hidden opcja jest wartością logiczną, więc możemy wywnioskować, że jeśli nie jest "hidden" : true , to jest "hidden" : false .
Nie możesz ukryć/odkryć indeksów? Sprawdź to ustawienie.
mongod featureCompatibilityVersion musi mieć co najmniej 4.4 zanim będzie można ukryć indeksy. Jednak po ukryciu indeks pozostanie ukryty nawet w przypadku featureCompatibilityVersion ustawiony na 4.2 w plikach binarnych MongoDB 4.4.
Możesz sprawdzić featureCompatibilityVersion ustawienie z następującym kodem:
db.adminCommand(
{
getParameter: 1,
featureCompatibilityVersion: 1
}
)
Możesz to ustawić za pomocą setFeatureCompatibilityVersion polecenie:
db.adminCommand( { setFeatureCompatibilityVersion: "4.4" } )
setFeatureCompatibilityVersion polecenie musi być uruchomione w admin baza danych.
Pamiętaj też, że nie możesz ukryć _id indeks.