Om du stöter på felet "indexnamn måste vara en sträng" när du släpper flera index i MongoDB, beror det förmodligen på att du skickar specifikationsdokumentet istället för namnet.
När du använder dropIndexes()
metoden eller dropIndexes
kommandot för att ta bort flera index måste du skicka indexet namn (inte specifikationsdokumenten) i en array.
Exempelindex
Anta att vi har följande index:
db.posts.getIndexes()
Resultat:
[ { "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 } ]
Problemkod
Här är ett exempel på kod som orsakar detta fel:
db.posts.dropIndexes( [
{ "_fts" : "text", "_ftsx" : 1 },
{ "title" : 1 }
] )
Resultat:
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
I det här exemplet försöker jag ta bort två index genom att skicka deras specifikationsdokument, men jag får ett fel. Jag måste skicka indexnamnen istället.
Lösning
För att lösa det här problemet behöver jag bara skicka indexnamnen istället för deras specifikationsdokument:
db.posts.dropIndexes( [
"body_text",
"title_1"
] )
Resultat:
{ "nIndexesWas" : 3, "ok" : 1 }
Det säger oss att indexen släpptes framgångsrikt.
Kontrollera resultaten
Vi kan köra getIndexes()
igen för att verifiera att indexen inte längre finns.
db.posts.getIndexes()
Resultat:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" } ]
Båda indexen har tappats som förväntat.