在MongoDB中取消隐藏索引的2种方法

发布于

如果在MongoDB中有一个隐藏索引,则可以使用该方法或管理命令来取消隐藏它。unhideIndex()``collMod

示例索引

让我们看一下名为 的集合上的索引:pets

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

使用方法取消隐藏unhideIndexes()

取消隐藏索引的第一种方法是使用该方法。此方法接受索引的名称或其键模式作为参数,以指定要取消隐藏的索引。db.collection.unhideIndex()

例:

db.pets.unhideIndex("idx_weight_-1")

输出:

{ “hidden_old” : true, “hidden_new” : false, “ok” : 1 }

该方法的输出显示字段的旧值(在本例中)和新值(在本例中)。unhideIndex()``hidden``true``false

但是,如果我们取消隐藏已经未隐藏的索引(或隐藏已经隐藏的索引),则不会显示这些索引,我们只会得到以下内容:

{ “ok” : 1 }

无论如何,索引现在都是未隐藏的。

该方法是管理命令的包装器(如下)。unhideIndex()``collMod

命令collMod

管理命令使我们能够向集合添加选项或修改视图定义。collMod

我们可以使用它来取消隐藏索引,方法是传递:hidden: false

例:

db.runCommand( {
   collMod: "pets",
   index: {
      name: "type_1",
      hidden: false
   }
} )

输出:

{ "hidden_old" : true, "hidden_new" : false, "ok" : 1 }

这将返回的同一文档。unhideIndex()

与 类似,您可以选择指定索引名称或其键模式。unhideIndex()

下面是使用密钥模式的示例:

db.runCommand( {
   collMod: "pets",
   index: {
      keyPattern: { "type" : 1 },
      hidden: false
   }
} )

在本例中,索引是使用 定义的,因此可以使用此定义代替索引名称。{ "type" : 1 }

验证更改

为了验证我们的更改,我们可以再次调用以查看索引的定义:getIndexes()

db.pets.getIndexes()

输出:

[
	{
		"v" : 2,
		"key" : {
			"_id" : 1
		},
		"name" : "_id_"
	},
	{
		"v" : 2,
		"key" : {
			"weight" : -1
		},
		"name" : "idx_weight_-1"
	},
	{
		"v" : 2,
		"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