unhideIndex() 在 MongoDB 中的工作原理
在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 } ]
我们可以看到有三个索引。第三个是隐藏的。我们知道这一点,因为它有."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” } ]
我们看到的三个索引与前面的示例相同,但这次我们没有看到 。"hidden" : true
但我们也没有看到."hidden" : false
取消隐藏索引只是从 的结果中删除该部分。仅当值为 .该选项是一个布尔值,因此我们可以推断,如果它不是,那么它是 。"hidden" : true``getIndexes()``hidden``true``hidden``"hidden" : true``"hidden" : false
无法隐藏/取消隐藏索引?检查此设置。
必须至少在隐藏索引之前。但是,一旦隐藏,即使在MongoDB 4.4二进制文件上设置为4.2,索引也将保持隐藏状态。mongod``featureCompatibilityVersion``4.4``featureCompatibilityVersion
您可以使用以下代码检查功能兼容性版本设置:
db.adminCommand(
{
getParameter: 1,
featureCompatibilityVersion: 1
}
)
您可以使用以下命令进行设置:setFeatureCompatibilityVersion
db.adminCommand( { setFeatureCompatibilityVersion: "4.4" } )
该命令需要在数据库中运行。setFeatureCompatibilityVersion``admin
另请注意,不能隐藏索引。_id