sql >> Database teknologi >  >> NoSQL >> MongoDB

Hvordan unhideIndex() virker i MongoDB

I MongoDB er db.collection.unhideIndex() metode viser et skjult indeks.

Et skjult indeks er et, der er skjult fra forespørgselsplanlæggeren. Når du viser et indeks, er det ikke længere skjult for forespørgselsplanlæggeren, og det er umiddelbart tilgængeligt til brug.

Eksempel

Antag, at vi har en samling kaldet pets , og vi vil gerne tjekke det for skjulte indekser. Vi kunne køre følgende forespørgsel for at returnere alle indekser på samlingen:

db.pets.getIndexes()

Resultat:

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

Vi kan se, at der er tre indekser. Den tredje er skjult. Vi ved det, fordi den har "hidden" : true .

Det indeks er på weight Mark. Når vi kører en forespørgsel gennem forespørgselsplanen, spørger vi efter weight felt, vil vi se, at den ikke bruger indekset.

Eksempel:

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

Resultat:

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

Vi kan se, at den lavede en COLLSCAN (en samlingsscanning), hvilket betyder, at den ikke brugte indekset.

Vis indekset

Vi kan bruge unhideIndex() metode til at vise indekset. Denne metode accepterer navnet på indekset eller dets nøglemønster som en parameter for at angive, hvilket indeks der skal vises.

Eksempel:

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

Output:

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

Outputtet af unhideIndex() metoden viser den gamle værdi for hidden felt (i dette tilfælde true ) og den nye værdi (i dette tilfælde false ).

Men hvis vi viser et allerede skjult indeks (eller skjuler et allerede skjult), vises disse ikke, og vi får bare følgende:

{ "ok" : 1 }

Uanset hvad er indekset nu skjult.

Tjek forespørgselsplanen igen

Lad os køre den forrige forespørgsel igen for at se, hvordan forespørgselsplanen ser ud nu.

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

Resultat:

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

Vi kan se, at den brugte IXSCAN , hvilket betyder, at den brugte indekset.

Tjek, om indekset er blevet skjult

Vi kan bruge getIndexes() metode igen for at kontrollere, om indekset er blevet vist eller ej.

db.pets.getIndexes()

Resultat:

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

Vi ser de samme tre indekser, som vi så i det tidligere eksempel, men denne gang ser vi ikke "hidden" : true .

Men vi ser heller ikke "hidden" : false .

Visning af et indeks fjerner simpelthen "hidden" : true del fra resultatet af getIndexes() . Den hidden indstillingen er kun tilgængelig, hvis værdien er true . Den hidden option er en boolesk værdi, så vi kan derfor udlede, at hvis den ikke er "hidden" : true , så er det "hidden" : false .

Kan du ikke skjule/vise indekser? Tjek denne indstilling.

mongod featureCompatibilityVersion skal være mindst 4.4 før du kan skjule indekser. Men når et indeks først er skjult, forbliver det skjult selv med featureCompatibilityVersion sat til 4.2 på MongoDB 4.4 binære filer.

Du kan tjekke featureCompatibilityVersion indstilling med følgende kode:

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

Du kan indstille det ved hjælp af setFeatureCompatibilityVersion kommando:

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

setFeatureCompatibilityVersion kommandoen skal køres i admin database.

Bemærk også, at du ikke kan skjule _id indeks.


  1. Kunne ikke hente en ressource fra puljen(SocketTimeoutException:)

  2. Konvertering af BSON Type ObjectId til JSON (lagring i Mongodb) -Java

  3. Mongo:hvordan man sorterer efter ekstern vægt

  4. MongoDB $allElementsTrue