MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como unhideIndex() funciona no MongoDB


No MongoDB, o db.collection.unhideIndex() O método exibe um índice oculto.

Um índice oculto é aquele que está oculto do planejador de consultas. Quando você exibe um índice, ele não fica mais oculto do planejador de consulta e fica imediatamente disponível para uso.

Exemplo


Suponha que tenhamos uma coleção chamada pets , e queremos verificar se há índices ocultos. Poderíamos executar a seguinte consulta para retornar todos os índices da coleção:
db.pets.getIndexes()

Resultado:
[
	{
		"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
	}
]

Podemos ver que existem três índices. O terceiro está escondido. Sabemos disso, porque tem "hidden" : true .

Esse índice está no weight campo. Quando executamos uma consulta por meio do plano de consulta que consulta o weight campo, veremos que ele não usa o índice.

Exemplo:
db.pets.find( { weight: { $gt: 10 } } ).explain()

Resultado:
{
	"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
}

Podemos ver que ele fez um COLLSCAN (uma varredura de coleção), o que significa que não usou o índice.

Reexibir o índice


Podemos usar o unhideIndex() método para exibir o índice. Esse método aceita o nome do índice ou seu padrão de chave como um parâmetro para especificar qual índice exibir.

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

Saída:
{ "hidden_old" : true, "hidden_new" : false, "ok" : 1 }

A saída do unhideIndex() método exibe o valor antigo para o hidden campo (neste caso true ) e o novo valor (neste caso false ).

No entanto, se exibirmos um índice já não oculto (ou ocultar um já oculto), eles não serão exibidos e obteremos apenas o seguinte:
{ "ok" : 1 }

Independentemente disso, o índice agora é reexibido.

Verifique novamente o plano de consulta


Vamos executar novamente a consulta anterior para ver como está o plano de consulta agora.
db.pets.find( { weight: { $gt: 10 } } ).explain()

Resultado:
{
	"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
}

Podemos ver que ele usou IXSCAN , o que significa que ele usou o índice.

Verifique se o índice foi reexibido


Podemos usar o getIndexes() método novamente para verificar se o índice foi ou não reexibido.
db.pets.getIndexes()

Resultado:
[
	{
		"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"
	}
]

Vemos os mesmos três índices que vimos no exemplo anterior, mas desta vez não vemos "hidden" : true .

Mas também não vemos "hidden" : false .

Reexibir um índice simplesmente remove o "hidden" : true parte do resultado de getIndexes() . O hidden a opção só está disponível se o valor for true . O hidden option é um valor booleano, portanto, podemos inferir que, se não for "hidden" : true , então é "hidden" : false .

Não é possível ocultar/exibir índices? Verifique esta configuração.


O mongod featureCompatibilityVersion deve ser pelo menos 4.4 antes que você possa ocultar índices. No entanto, uma vez oculto, um índice permanecerá oculto mesmo com featureCompatibilityVersion definido como 4.2 nos binários do MongoDB 4.4.

Você pode verificar a featureCompatibilityVersion configuração com o seguinte código:
db.adminCommand( 
    { 
        getParameter: 1, 
        featureCompatibilityVersion: 1 
    } 
)

Você pode configurá-lo usando o setFeatureCompatibilityVersion comando:
db.adminCommand( { setFeatureCompatibilityVersion: "4.4" } )

A setFeatureCompatibilityVersion comando precisa ser executado no admin base de dados.

Observe também que você não pode ocultar o _id índice.