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

Come creare un indice con un nome specifico in MongoDB

Quando crei un indice in MongoDB, se non specifichi un nome per esso, MongoDB ne assegnerà uno.

Il nome predefinito è costituito da ogni nome di campo indicizzato concatenato con il valore chiave per quel campo. Ad esempio, l'ordinamento o se è un text index, la stringa _text o se è una 2dsphere index, la stringa _2dsphere , ecc.

Ma puoi assegnare il tuo nome durante la creazione di indici in MongoDB.

Il nome predefinito

Supponiamo di creare un indice come questo:

db.employees.createIndex(
  { 
    name: 1, 
    salary: -1 }
  )

Non abbiamo specificato un nome, quindi MongoDB ne genererà uno automaticamente, in base alla specifica dell'indice.

Usiamo getIndexes() per verificarlo:

db.employees.getIndexes()

Risultato:

[
	{
		"v" : 2,
		"key" : {
			"_id" : 1
		},
		"name" : "_id_"
	},
	{
		"v" : 2,
		"key" : {
			"name" : 1,
			"salary" : -1
		},
		"name" : "name_1_salary_-1"
	}
]

Ci sono due indici qui. Il primo è il _id predefinito indice che viene creato automaticamente con la raccolta. Il secondo è quello che abbiamo appena creato.

In questo caso, MongoDB ha assegnato all'indice un nome di name_1_salary_-1 .

Se mai dovessimo eliminare questo indice, dovremmo ricordarne il nome o la definizione. Dato che il nome predefinito si basa sulla definizione, potrebbe diventare un po' ingombrante se si dispone di una definizione più complessa.

In ogni caso, possiamo eliminare l'indice sopra in questo modo:

db.employees.dropIndex("name_1_salary_-1")

Specifica un nome

Se volessimo creare il nostro nome per l'indice, avremmo potuto crearlo in questo modo:

db.employees.createIndex(
  { 
    name: 1,
    salary: -1 
  },
  { 
    name: "employee_salary" 
    }
)

Tutto ciò che abbiamo fatto è stato aggiungere un name campo all'interno di un documento facoltativo per la fornitura di opzioni per l'indice.

Se ora controlliamo l'indice, possiamo vedere che ha il nome che abbiamo fornito:

db.employees.getIndexes()

Risultato:

[
	{
		"v" : 2,
		"key" : {
			"_id" : 1
		},
		"name" : "_id_"
	},
	{
		"v" : 2,
		"key" : {
			"name" : 1,
			"salary" : -1
		},
		"name" : "employee_salary"
	}
]

Incluso il nome con altre opzioni

Nell'esempio precedente, il name field è l'unica opzione che abbiamo fornito durante la creazione dell'indice. Il nome non è l'unica opzione che puoi specificare per un indice.

Puoi anche fornire altre opzioni, come la lingua predefinita, la sostituzione della lingua e così via. Eventuali altre opzioni dovranno essere racchiuse all'interno dello stesso documento, separate da una virgola.

Ecco un esempio di creazione di un indice con altre due opzioni (ma senza specificare il nome):

db.sitcoms.createIndex( 
  { 
    "original_name": "text",
    "translations.sitcom_name": "text"
  },
  {
    "default_language": "danish",
    "language_override": "sprog"
  }
)

Questo è un indice diverso su una raccolta diversa dalla precedente. Ma puoi vedere che abbiamo specificato il nostro default_language e un language_override valori. È anche un indice composto (è un indice che include più campi).

Non ho specificato un nome, quindi possiamo vedere quanto tempo diventa il nome con un tale indice:

db.employees.getIndexes()

Risultato:

[
	{
		"v" : 2,
		"key" : {
			"_id" : 1
		},
		"name" : "_id_"
	},
	{
		"v" : 2,
		"key" : {
			"_fts" : "text",
			"_ftsx" : 1
		},
		"name" : "original_name_text_translations.sitcom_name_text",
		"default_language" : "danish",
		"language_override" : "sprog",
		"weights" : {
			"original_name" : 1,
			"translations.sitcom_name" : 1
		},
		"textIndexVersion" : 3
	}
]

Quindi in questo caso MongoDB ha assegnato all'indice un nome predefinito di original_name_text_translations.sitcom_name_text , perché deriva dalla nostra definizione di indice.

Dovremmo usare il codice seguente per eliminare questo indice per nome:

db.sitcoms.dropIndex("original_name_text_translations.sitcom_name_text")

Per includere il nome in un tale indice, possiamo fornirlo nello stesso documento che abbiamo usato per specificare la lingua predefinita e la sostituzione della lingua.

Quindi potremmo creare l'indice in questo modo:

db.sitcoms.createIndex( 
  { 
    "original_name": "text",
    "translations.sitcom_name": "text"
  },
  {
    "default_language": "danish",
    "language_override": "sprog",
    "name": "sitcoms_da"
  }
)

In questo caso abbiamo usato sitcoms_da come nome dell'indice.

Ora, quando otteniamo un elenco di indici, possiamo vedere il nostro nome specificato:

db.sitcoms.getIndexes()

Risultato:

[
	{
		"v" : 2,
		"key" : {
			"_id" : 1
		},
		"name" : "_id_"
	},
	{
		"v" : 2,
		"key" : {
			"_fts" : "text",
			"_ftsx" : 1
		},
		"name" : "sitcoms_da",
		"default_language" : "danish",
		"language_override" : "sprog",
		"weights" : {
			"original_name" : 1,
			"translations.sitcom_name" : 1
		},
		"textIndexVersion" : 3
	}
]