在MongoDB中从查询计划中隐藏索引的3种方法
从MongoDB 4.4开始,我们现在可以从查询计划中隐藏索引。这使我们能够评估删除索引而不实际删除索引的潜在影响。
如果隐藏它有负面影响,我们可以取消隐藏索引。这使我们不必删除索引,然后再次重新创建它。
以下是在MongoDB中隐藏索引的3种方法。
方法hideIndex()
该方法完全按照它的承诺执行 - 它隐藏索引(从查询规划器)。db.collection.hideIndex()
例:
db.pets.hideIndex("idx_weight_-1")
输出:
{ “hidden_old” : false, “hidden_new” : true, “ok” : 1 }
这将隐藏在集合上调用的索引。或者,我们可以为索引提供键模式而不是名称。idx_weight_-1``pets
该方法的输出显示字段的旧值(在本例中)和新值(在本例中)。hideIndex()``hidden``false``true
但是,如果我们隐藏已经隐藏的索引(或取消隐藏已经未隐藏的索引),则不会显示这些索引,我们只会得到以下内容:
{ “ok” : 1 }
无论如何,索引现在都是隐藏的。
该方法实际上是管理命令的包装器(如下)。hideIndex()``collMod
命令collMod
管理命令使我们能够向集合添加选项或修改视图定义。collMod
我们可以使用它通过传递来隐藏索引。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()](https://database.guide/get-a-list-of-indexes-in-mongodb/ "Get a List of Indexes in MongoDB")
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
无法隐藏索引?检查此设置。
必须至少在隐藏索引之前。但是,一旦隐藏,即使在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