在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