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
を非表示にすることはできません。 インデックス。