Започвайки от MongoDB 4.4, вече можем да скрием индекси от плана на заявката. Това ни позволява да оценим потенциалното въздействие от отпадането на индекс, без действително да отпадаме индекса.
Ако скриването му има отрицателно въздействие, можем да разкрием индекса. Това ни спестява от необходимостта да пускаме индекса, след което да го създаваме отново.
По-долу са 3 начина за скриване на индекс в MongoDB.
hideIndex()
Метод
db.collection.hideIndex()
метод прави точно както обещава – той скрива индекса (от планировщика на заявки).
Пример:
db.pets.hideIndex("idx_weight_-1")
Изход:
{ "hidden_old" : false, "hidden_new" : true, "ok" : 1 }
Това крие индекс, наречен idx_weight_-1
на pets
колекция. Алтернативно бихме могли да предоставим ключовия модел за индекса вместо името.
Резултатът от hideIndex()
method показва старата стойност за hidden
поле (в този случай false
) и новата стойност (в този случай true
).
Ако обаче скрием вече скрит индекс (или разкрием вече нескрит), те не се показват и просто получаваме следното:
{ "ok" : 1 }
Във всеки случай индексът вече е скрит.
hideIndex()
Методът всъщност е обвивка за collMod
команда за администриране (по-долу).
collMod
Команда
collMod
командата Administration ни позволява да добавяме опции към колекция или да променяме дефинициите на изглед.
Можем да го използваме, за да скрием индекс, като предадем hidden: true
.
Пример:
db.runCommand( {
collMod: "pets",
index: {
name: "idx_weight_-1",
hidden: true
}
} )
Резултат:
{ "hidden_old" : false, "hidden_new" : true, "ok" : 1 }
Това връща същия документ, който hideIndex()
връща.
Подобно на hideIndex()
, имате възможност да посочите името на индекса или неговия ключов модел.
Ето пример за използване на ключовия модел:
db.runCommand( {
collMod: "pets",
index: {
keyPattern: { weight : -1 },
hidden: true
}
} )
В този случай индексът е дефиниран с помощта на { weight : -1 }
, така че тази дефиниция може да се използва вместо името на индекса.
За да проверим това, можем да използваме getIndexes()
за да видите дефиницията на индекса:
db.pets.getIndexes()
Резултат:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "weight" : -1 }, "name" : "idx_weight_-1", "hidden" : true } ]
Можем също да разкрием индекса, като предадем hidden: false
.
Създайте скрит индекс
Третият начин да скриете индекс е да го създадете като скрит индекс.
За да направите това, използвайте hidden: true
като една от опциите, когато създавате индекса.
Пример:
db.pets.createIndex(
{ type: 1 },
{ hidden: true }
)
Изход:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 2, "numIndexesAfter" : 3, "ok" : 1 }
Сега нека извикаме getIndexes()
отново, за да проверите новосъздадения ни скрит индекс:
db.pets.getIndexes()
Резултат:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "weight" : -1 }, "name" : "idx_weight_-1", "hidden" : true }, { "v" : 2, "hidden" : true, "key" : { "type" : 1 }, "name" : "type_1" } ]
Можем да видим, че е създаден с "hidden": true
.
Не можете да скриете индекси? Проверете тази настройка.
mongod
featureCompatibilityVersion
трябва да е най-малко 4.4
преди да можете да скриете индекси. Въпреки това, след като бъде скрит, индексът ще остане скрит дори с featureCompatibilityVersion
зададен на 4.2 на MongoDB 4.4 двоични файлове.
Можете да проверите featureCompatibilityVersion
настройка със следния код:
db.adminCommand(
{
getParameter: 1,
featureCompatibilityVersion: 1
}
)
Можете да го настроите с помощта на setFeatureCompatibilityVersion
команда:
db.adminCommand( { setFeatureCompatibilityVersion: "4.4" } )
setFeatureCompatibilityVersion
командата трябва да се изпълни в admin
база данни.
Също така имайте предвид, че не можете да скриете _id
индекс.