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.