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

Corrige “o nome do índice deve ser uma string” ao descartar vários índices no MongoDB


Se você encontrar o erro “o nome do índice deve ser uma string” ao descartar vários índices no MongoDB, provavelmente é porque você está passando o documento de especificações em vez do nome.

Quando você usa o dropIndexes() método ou o dropIndexes comando para descartar vários índices, você precisa passar o índice nomes (não os documentos de especificações) em uma matriz.

Exemplos de índices


Suponha que temos os seguintes índices:
db.posts.getIndexes()

Resultado:
[
	{
		"v" : 2,
		"key" : {
			"_id" : 1
		},
		"name" : "_id_"
	},
	{
		"v" : 2,
		"key" : {
			"title" : 1
		},
		"name" : "title_1"
	},
	{
		"v" : 2,
		"key" : {
			"_fts" : "text",
			"_ftsx" : 1
		},
		"name" : "body_text",
		"weights" : {
			"body" : 1
		},
		"default_language" : "english",
		"language_override" : "language",
		"textIndexVersion" : 3
	}
]

Código do problema


Aqui está um exemplo de código que causa esse erro:
db.posts.dropIndexes( [ 
  { "_fts" : "text", "_ftsx" : 1 }, 
  { "title" : 1 } 
] )

Resultado:
uncaught exception: Error: error dropping indexes : {
	"ok" : 0,
	"errmsg" : "dropIndexes krankykranes.posts (f9083c2c-8291-49d1-95f7-40711186db98) failed to drop multiple indexes [ { _fts: \"text\", _ftsx: 1.0 }, { title: 1.0 } ]: index name must be a string",
	"code" : 14,
	"codeName" : "TypeMismatch"
} :
[email protected]/mongo/shell/utils.js:25:13
[email protected]/mongo/shell/collection.js:692:11
@(shell):1:1

Neste exemplo, estou tentando excluir dois índices passando seus documentos de especificação, mas recebo um erro. Eu preciso passar os nomes de índice em vez disso.

Solução


Para corrigir esse problema, basta passar os nomes dos índices em vez de seu documento de especificação:
db.posts.dropIndexes( [ 
  "body_text", 
  "title_1" 
] )

Resultado:
{ "nIndexesWas" : 3, "ok" : 1 }

Isso nos diz que os índices foram descartados com sucesso.

Verifique os resultados


Podemos executar getIndexes() novamente para verificar se os índices não existem mais.
db.posts.getIndexes()

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

Ambos os índices foram descartados como esperado.