sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur unhideIndex() fungerar i MongoDB

I MongoDB, db.collection.unhideIndex() metoden visar ett dolt index.

Ett dolt index är ett som är dolt från frågeplaneraren. När du visar ett index är det inte längre dolt från frågeplaneraren och det är omedelbart tillgängligt för användning.

Exempel

Anta att vi har en samling som heter pets , och vi vill kontrollera det för dolda index. Vi skulle kunna köra följande fråga för att returnera alla index 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 att det finns tre index. Den tredje är gömd. Vi vet det eftersom den har "hidden" : true .

Det indexet är på weight fält. När vi kör en fråga genom frågeplanen som frågar efter weight fältet ser vi att det inte använder indexet.

Exempel:

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 att den gjorde en COLLSCAN (en samlingsskanning), vilket betyder att den inte använde indexet.

Visa indexet

Vi kan använda unhideIndex() metod för att visa indexet. Denna metod accepterar namnet på indexet eller dess nyckelmönster som en parameter för att ange vilket index som ska visas.

Exempel:

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

Utdata:

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

Utdata från unhideIndex() metoden visar det gamla värdet för hidden fältet (i det här fallet true ) och det nya värdet (i det här fallet false ).

Men om vi visar ett redan dolt index (eller döljer ett redan dolt) visas dessa inte, och vi får bara följande:

{ "ok" : 1 }

Oavsett vilket är indexet nu odollat.

Kontrollera frågeplanen igen

Låt oss köra om den föregående frågan för att se hur frågeplanen ser ut 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 att den använde IXSCAN , vilket betyder att den använde indexet.

Kontrollera om indexet har döljts

Vi kan använda getIndexes() metod igen för att kontrollera om indexet har döljts eller inte.

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 samma tre index som vi såg i det tidigare exemplet, men den här gången ser vi inte "hidden" : true .

Men vi ser inte heller "hidden" : false .

Att visa ett index tar helt enkelt bort "hidden" : true del från resultatet av getIndexes() . Den hidden alternativet är endast tillgängligt om värdet är true . Den hidden alternativet är ett booleskt värde, så vi kan därför dra slutsatsen att om det inte är "hidden" : true , då är det "hidden" : false .

Kan du inte dölja/visa index? Kontrollera den här inställningen.

mongod featureCompatibilityVersion måste vara minst 4.4 innan du kan dölja index. Men när det väl är dolt kommer ett index att förbli dolt även med featureCompatibilityVersion inställd på 4.2 på MongoDB 4.4 binärer.

Du kan kontrollera featureCompatibilityVersion inställning med följande kod:

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

Du kan ställa in den med setFeatureCompatibilityVersion kommando:

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

setFeatureCompatibilityVersion kommandot måste köras i admin databas.

Observera också att du inte kan dölja _id index.


  1. MongoDB $avg Aggregation Pipeline Operator

  2. MongoDB C#:ID Serialization bästa mönstret

  3. MongoDB $sortiment

  4. MongoDB hel och partiell textsökning