MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como criar um índice com um nome específico no MongoDB


Ao criar um índice no MongoDB, se você não especificar um nome para ele, o MongoDB atribuirá um.

O nome padrão consiste em cada nome de campo indexado concatenado com o valor da chave desse campo. Por exemplo, a ordem de classificação ou se for um text index, a string _text , ou se for um 2dsphere index, a string _2dsphere , etc

Mas você pode atribuir seu próprio nome ao criar índices no MongoDB.

O nome padrão


Suponha que criamos um índice como este:
db.employees.createIndex(
  { 
    name: 1, 
    salary: -1 }
  )

Nós não especificamos um nome, então o MongoDB irá gerar um automaticamente, baseado na especificação do índice.

Usamos getIndexes() para verificar isso:
db.employees.getIndexes()

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

Existem dois índices aqui. O primeiro é o padrão _id índice que é criado automaticamente com a coleção. O segundo é o que acabamos de criar.

Nesse caso, o MongoDB deu ao índice um nome de name_1_salary_-1 .

Se algum dia precisarmos eliminar esse índice, precisaremos lembrar seu nome ou sua definição. Dado que o nome padrão é baseado na definição, pode ficar um pouco complicado se você tiver uma definição mais complexa.

De qualquer forma, podemos descartar o índice acima assim:
db.employees.dropIndex("name_1_salary_-1")

Especifique um nome


Se quiséssemos criar nosso próprio nome para o índice, poderíamos criá-lo assim:
db.employees.createIndex(
  { 
    name: 1,
    salary: -1 
  },
  { 
    name: "employee_salary" 
    }
)

Tudo o que fizemos foi adicionar um name campo dentro de um documento opcional para fornecer opções para o índice.

Se agora verificarmos o índice, podemos ver que ele tem o nome que fornecemos:
db.employees.getIndexes()

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

Incluindo o nome com outras opções


No exemplo anterior, o name campo é a única opção que fornecemos ao criar o índice. O nome não é a única opção que você pode especificar para um índice.

Você também pode fornecer outras opções, como o idioma padrão, substituição de idioma, etc. Quaisquer outras opções precisarão ser incluídas no mesmo documento, separadas por uma vírgula.

Aqui está um exemplo de criação de um índice com duas outras opções (mas sem especificar o nome):
db.sitcoms.createIndex( 
  { 
    "original_name": "text",
    "translations.sitcom_name": "text"
  },
  {
    "default_language": "danish",
    "language_override": "sprog"
  }
)

Este é um índice diferente em uma coleção diferente da anterior. Mas você pode ver que especificamos nosso próprio default_language e um language_override valores. É também um índice composto (é um índice que inclui vários campos).

Eu não especifiquei um nome, então podemos ver quanto tempo o nome se torna com esse índice:
db.employees.getIndexes()

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

Portanto, neste caso, o MongoDB deu ao índice um nome padrão de original_name_text_translations.sitcom_name_text , porque isso é derivado de nossa definição de índice.

Precisaríamos usar o seguinte código para descartar esse índice por nome:
db.sitcoms.dropIndex("original_name_text_translations.sitcom_name_text")

Para incluir o nome em tal índice, podemos fornecê-lo no mesmo documento que usamos para especificar o idioma padrão e a substituição de idioma.

Então poderíamos criar o índice assim:
db.sitcoms.createIndex( 
  { 
    "original_name": "text",
    "translations.sitcom_name": "text"
  },
  {
    "default_language": "danish",
    "language_override": "sprog",
    "name": "sitcoms_da"
  }
)

Neste caso usamos sitcoms_da como o nome do índice.

Agora, quando obtemos uma lista de índices, podemos ver nosso nome especificado:
db.sitcoms.getIndexes()

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