sql >> Database >  >> NoSQL >> MongoDB

Hoe unhideIndex() werkt in MongoDB

In MongoDB, de db.collection.unhideIndex() methode maakt een verborgen index zichtbaar.

Een verborgen index is een index die verborgen is voor de queryplanner. Wanneer u een index zichtbaar maakt, wordt deze niet langer verborgen voor de queryplanner en is deze onmiddellijk beschikbaar voor gebruik.

Voorbeeld

Stel dat we een verzameling hebben met de naam pets , en we willen het controleren op verborgen indexen. We zouden de volgende query kunnen uitvoeren om alle indexen van de collectie te retourneren:

db.pets.getIndexes()

Resultaat:

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

We kunnen zien dat er drie indexen zijn. De derde is verborgen. We weten dat, want het heeft "hidden" : true .

Die index staat op het weight veld. Wanneer we een query uitvoeren via het queryplan dat het weight . opvraagt veld, zullen we zien dat het de index niet gebruikt.

Voorbeeld:

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

Resultaat:

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

We kunnen zien dat het een COLLSCAN . heeft gedaan (een collectiescan), wat betekent dat het de index niet heeft gebruikt.

De index zichtbaar maken

We kunnen de unhideIndex() . gebruiken methode om de index zichtbaar te maken. Deze methode accepteert de naam van de index of het sleutelpatroon als parameter om aan te geven welke index zichtbaar moet worden gemaakt.

Voorbeeld:

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

Uitgang:

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

De uitvoer van de unhideIndex() methode geeft de oude waarde weer voor de hidden veld (in dit geval true ) en de nieuwe waarde (in dit geval false ).

Als we echter een reeds niet-verborgen index zichtbaar maken (of een reeds verborgen index verbergen), worden deze niet weergegeven en krijgen we alleen het volgende:

{ "ok" : 1 }

Hoe dan ook, de index is nu zichtbaar.

Controleer het queryplan opnieuw

Laten we de vorige query opnieuw uitvoeren om te zien hoe het queryplan er nu uitziet.

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

Resultaat:

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

We kunnen zien dat het IXSCAN . gebruikte , wat betekent dat het de index gebruikte.

Controleer of de index zichtbaar is gemaakt

We kunnen de getIndexes() . gebruiken methode opnieuw om te controleren of de index al dan niet zichtbaar is gemaakt.

db.pets.getIndexes()

Resultaat:

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

We zien dezelfde drie indexen die we in het eerdere voorbeeld zagen, maar deze keer zien we niet "hidden" : true .

Maar we zien ook niet "hidden" : false .

Het zichtbaar maken van een index verwijdert eenvoudig de "hidden" : true deel van het resultaat van getIndexes() . De hidden optie is alleen beschikbaar als de waarde true is . De hidden optie is een booleaanse waarde, dus we kunnen daarom afleiden dat als het niet "hidden" : true , dan is het "hidden" : false .

Kan indexen niet verbergen/weergeven? Vink deze instelling aan.

De mongod featureCompatibilityVersion moet minimaal 4.4 . zijn voordat u indexen kunt verbergen. Eenmaal verborgen, blijft een index echter verborgen, zelfs met featureCompatibilityVersion ingesteld op 4.2 op MongoDB 4.4 binaire bestanden.

U kunt de featureCompatibilityVersion . controleren instelling met de volgende code:

db.adminCommand( 
    { 
        getParameter: 1, 
        featureCompatibilityVersion: 1 
    } 
)

U kunt het instellen met behulp van de setFeatureCompatibilityVersion commando:

db.adminCommand( { setFeatureCompatibilityVersion: "4.4" } )

De setFeatureCompatibilityVersion commando moet worden uitgevoerd in de admin database.

Merk ook op dat u de _id . niet kunt verbergen index.


  1. Redis-sleutels en -waarden ophalen bij de opdrachtprompt

  2. MongoDB - paging

  3. Hoe Yii2 in te stellen met Redis-configuratie

  4. Hoe de verbinding met Mongodb op de juiste manier opnieuw te gebruiken in de toepassing en modules van NodeJs