MongoDBでは、db.collection.unhideIndex() メソッドは非表示のインデックスを再表示します。
非表示のインデックスは、クエリプランナーから非表示になっているインデックスです。インデックスを再表示すると、クエリプランナーから非表示にならず、すぐに使用できるようになります。
例
petsというコレクションがあるとします。 、および非表示のインデックスを確認します。次のクエリを実行して、コレクションのすべてのインデックスを返すことができます。
db.pets.getIndexes() 結果:
[
{
"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
}
]
3つのインデックスがあることがわかります。 3つ目は非表示です。 "hidden" : trueがあるので、私たちはそれを知っています 。
そのインデックスはweightにあります 分野。 weightをクエリするクエリプランを介してクエリを実行する場合 フィールドには、インデックスが使用されていないことがわかります。
例:
db.pets.find( { weight: { $gt: 10 } } ).explain() 結果:
{
"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
}
COLLSCANを実行したことがわかります (コレクションスキャン)。これは、インデックスを使用しなかったことを意味します。
インデックスを再表示
unhideIndex()を使用できます インデックスを再表示するメソッド。このメソッドは、インデックスの名前またはそのキーパターンをパラメーターとして受け入れ、再表示するインデックスを指定します。
例:
db.pets.unhideIndex("idx_weight_-1") 出力:
{ "hidden_old" : true, "hidden_new" : false, "ok" : 1 }
unhideIndex()の出力 メソッドは、hiddenの古い値を表示します フィールド(この場合はtrue )と新しい値(この場合はfalse 。
ただし、すでに非表示になっているインデックスを再表示する(またはすでに非表示になっているインデックスを非表示にする)と、これらは表示されず、次のようになります。
{ "ok" : 1 } とにかく、インデックスは非表示になりません。
クエリプランを再確認する
前のクエリを再実行して、クエリプランが現在どのようになっているのかを確認しましょう。
db.pets.find( { weight: { $gt: 10 } } ).explain() 結果:
{
"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
}
IXSCANを使用していることがわかります 、これはインデックスを使用したことを意味します。
インデックスが非表示になっているかどうかを確認する
getIndexes()を使用できます インデックスが非表示になっていないかどうかをもう一度確認する方法。
db.pets.getIndexes() 結果:
[
{
"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"
}
]
前の例で見たのと同じ3つのインデックスが表示されますが、今回は"hidden" : trueは表示されません。 。
ただし、"hidden" : falseも表示されません 。
インデックスを非表示にすると、"hidden" : trueが削除されます。 getIndexes()の結果の一部 。 hidden オプションは、値がtrueの場合にのみ使用できます 。 hidden optionはブール値であるため、"hidden" : trueでない場合は推測できます。 、それからそれは"hidden" : false 。
インデックスを非表示/再表示できませんか?この設定を確認してください。
mongod featureCompatibilityVersion 少なくとも4.4である必要があります インデックスを非表示にする前に。ただし、一度非表示にすると、featureCompatibilityVersionを使用してもインデックスは非表示のままになります MongoDB4.4バイナリでは4.2に設定されています。
featureCompatibilityVersionを確認できます 次のコードで設定します:
db.adminCommand(
{
getParameter: 1,
featureCompatibilityVersion: 1
}
)
setFeatureCompatibilityVersionを使用して設定できます コマンド:
db.adminCommand( { setFeatureCompatibilityVersion: "4.4" } )
setFeatureCompatibilityVersion コマンドはadminで実行する必要があります データベース。
また、_idを非表示にすることはできません。 インデックス。