Pokud se při odstraňování více indexů v MongoDB setkáte s chybou „název indexu musí být řetězec“, je to pravděpodobně proto, že místo názvu předáváte dokument se specifikacemi.
Když použijete dropIndexes()
nebo dropIndexes
příkaz k odstranění více indexů, musíte předat index jména (nikoli dokumenty specifikací) v poli.
Příklady indexů
Předpokládejme, že máme následující indexy:
db.posts.getIndexes()
Výsledek:
[ { "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 } ]
Kód problému
Zde je příklad kódu, který tuto chybu způsobuje:
db.posts.dropIndexes( [
{ "_fts" : "text", "_ftsx" : 1 },
{ "title" : 1 }
] )
Výsledek:
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
V tomto příkladu se pokouším odstranit dva indexy předáním jejich specifikačních dokumentů, ale zobrazí se chyba. Místo toho musím předat názvy indexů.
Řešení
Abych tento problém vyřešil, musím jednoduše předat názvy indexů namísto jejich dokumentu specifikace:
db.posts.dropIndexes( [
"body_text",
"title_1"
] )
Výsledek:
{ "nIndexesWas" : 3, "ok" : 1 }
To nám říká, že indexy byly úspěšně zrušeny.
Zkontrolujte výsledky
Můžeme spustit getIndexes()
znovu, abyste ověřili, že indexy již neexistují.
db.posts.getIndexes()
Výsledek:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" } ]
Oba indexy byly podle očekávání vypuštěny.