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

3 modi per nascondere un indice dal piano di query in MongoDB

A partire da MongoDB 4.4, ora possiamo nascondere gli indici dal piano di query. Questo ci consente di valutare l'impatto potenziale dell'eliminazione di un indice senza effettivamente eliminare l'indice.

Se nasconderlo ha un impatto negativo, possiamo mostrare l'indice. Questo ci evita di dover eliminare l'indice, quindi ricrearlo di nuovo.

Di seguito sono riportati 3 modi per nascondere un indice in MongoDB.

Il hideIndex() Metodo

Il db.collection.hideIndex() il metodo fa esattamente quello che promette:nasconde l'indice (dal pianificatore di query).

Esempio:

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

Uscita:

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

Questo nasconde un indice chiamato idx_weight_-1 sugli pets collezione. In alternativa potremmo fornire il modello di chiave per l'indice invece del nome.

L'output di hideIndex() il metodo mostra il vecchio valore per hidden campo (in questo caso false ) e il nuovo valore (in questo caso true ).

Tuttavia, se nascondiamo un indice già nascosto (o mostriamo uno già non nascosto), questi non vengono visualizzati e otteniamo solo quanto segue:

{ "ok" : 1 }

In ogni caso, l'indice è ora nascosto.

Il hideIndex() metodo è in realtà un wrapper per collMod comando di amministrazione (sotto).

Il collMod Comando

Il collMod Il comando di amministrazione ci consente di aggiungere opzioni a una raccolta o di modificare le definizioni delle viste.

Possiamo usarlo per nascondere un indice passando hidden: true .

Esempio:

db.runCommand( {
   collMod: "pets",
   index: {
      name: "idx_weight_-1",
      hidden: true
   }
} )

Risultato:

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

Questo restituisce lo stesso documento che hideIndex() resi.

Simile a hideIndex() , hai la possibilità di specificare il nome dell'indice o il suo schema di chiave.

Ecco un esempio di utilizzo del pattern chiave:

db.runCommand( {
   collMod: "pets",
   index: {
      keyPattern: { weight : -1 },
      hidden: true
   }
} )

In questo caso, l'indice è stato definito utilizzando { weight : -1 } , quindi questa definizione può essere utilizzata al posto del nome dell'indice.

Per verificarlo, possiamo usare getIndexes() per vedere la definizione dell'indice:

db.pets.getIndexes()

Risultato:

[
	{
		"v" : 2,
		"key" : {
			"_id" : 1
		},
		"name" : "_id_"
	},
	{
		"v" : 2,
		"key" : {
			"weight" : -1
		},
		"name" : "idx_weight_-1",
		"hidden" : true
	}
]

Possiamo anche mostrare l'indice passando hidden: false .

Crea un indice nascosto

Il terzo modo per nascondere un indice è crearlo come indice nascosto.

Per fare ciò, usa hidden: true come una delle opzioni quando crei l'indice.

Esempio:

db.pets.createIndex( 
    { type: 1 },
    { hidden: true }
)

Uscita:

{
	"createdCollectionAutomatically" : false,
	"numIndexesBefore" : 2,
	"numIndexesAfter" : 3,
	"ok" : 1
}

Ora chiamiamo getIndexes() di nuovo per controllare il nostro indice nascosto appena creato:

db.pets.getIndexes()

Risultato:

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

Possiamo vedere che è stato creato con "hidden": true .

Non riesci a nascondere gli indici? Controlla questa impostazione.

Il mongod featureCompatibilityVersion deve essere almeno 4.4 prima di poter nascondere gli indici. Tuttavia, una volta nascosto, un indice rimarrà nascosto anche con featureCompatibilityVersion impostato su 4.2 sui binari MongoDB 4.4.

Puoi controllare la featureCompatibilityVersion impostazione con il seguente codice:

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

Puoi impostarlo utilizzando setFeatureCompatibilityVersion comando:

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

Il setFeatureCompatibilityVersion il comando deve essere eseguito in admin banca dati.

Nota inoltre che non puoi nascondere il _id indice.