sql >> Base de Datos >  >> NoSQL >> MongoDB

Arreglar "el nombre del índice debe ser una cadena" al eliminar múltiples índices en MongoDB

Si encuentra el error "el nombre del índice debe ser una cadena" al colocar varios índices en MongoDB, probablemente se deba a que está pasando el documento de especificaciones en lugar del nombre.

Cuando usas dropIndexes() método o dropIndexes comando para eliminar varios índices, debe pasar el índice names (no los documentos de especificaciones) en una matriz.

Índices de ejemplo

Supongamos que tenemos los siguientes í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 de problema

Aquí hay un ejemplo de código que causa este error:

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

En este ejemplo, intento eliminar dos índices pasando sus documentos de especificación, pero aparece un error. Necesito pasar los nombres de índice en su lugar.

Solución

Para solucionar este problema, simplemente necesito pasar los nombres de índice en lugar de su documento de especificación:

db.posts.dropIndexes( [ 
  "body_text", 
  "title_1" 
] )

Resultado:

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

Eso nos dice que los índices se eliminaron con éxito.

Comprueba los resultados

Podemos ejecutar getIndexes() nuevamente para verificar que los índices ya no existen.

db.posts.getIndexes()

Resultado:

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

Ambos índices se han eliminado como se esperaba.