Wenn beim Löschen mehrerer Indizes in MongoDB der Fehler „Indexname muss eine Zeichenfolge sein“ auftritt, liegt dies wahrscheinlich daran, dass Sie das Spezifikationsdokument anstelle des Namens übergeben.
Wenn Sie dropIndexes()
verwenden -Methode oder die dropIndexes
Um mehrere Indizes zu löschen, müssen Sie den Index names übergeben (nicht die Spezifikationsdokumente) in einem Array.
Beispielindizes
Angenommen, wir haben die folgenden Indizes:
db.posts.getIndexes()
Ergebnis:
[ { "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 } ]
Problemcode
Hier ist ein Codebeispiel, das diesen Fehler verursacht:
db.posts.dropIndexes( [
{ "_fts" : "text", "_ftsx" : 1 },
{ "title" : 1 }
] )
Ergebnis:
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
In diesem Beispiel versuche ich, zwei Indizes zu löschen, indem ich ihre Spezifikationsdokumente übergebe, aber ich erhalte eine Fehlermeldung. Ich muss stattdessen die Indexnamen übergeben.
Lösung
Um dieses Problem zu beheben, muss ich einfach die Indexnamen anstelle ihres Spezifikationsdokuments übergeben:
db.posts.dropIndexes( [
"body_text",
"title_1"
] )
Ergebnis:
{ "nIndexesWas" : 3, "ok" : 1 }
Das sagt uns, dass die Indizes erfolgreich gelöscht wurden.
Überprüfen Sie die Ergebnisse
Wir können getIndexes()
ausführen erneut, um zu überprüfen, ob die Indizes nicht mehr existieren.
db.posts.getIndexes()
Ergebnis:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" } ]
Beide Indizes wurden wie erwartet gelöscht.