Jeśli napotkasz błąd „nazwa indeksu musi być ciągiem znaków” podczas upuszczania wielu indeksów w MongoDB, prawdopodobnie dlatego, że przekazujesz dokument specyfikacji zamiast nazwy.
Kiedy używasz dropIndexes()
metody lub dropIndexes
polecenie, aby usunąć wiele indeksów, musisz przekazać indeks nazwy (nie dokumenty specyfikacji) w tablicy.
Przykładowe indeksy
Załóżmy, że mamy następujące indeksy:
db.posts.getIndexes()
Wynik:
[ { "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 } ]
Kod problemu
Oto przykład kodu, który powoduje ten błąd:
db.posts.dropIndexes( [
{ "_fts" : "text", "_ftsx" : 1 },
{ "title" : 1 }
] )
Wynik:
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
W tym przykładzie próbuję usunąć dwa indeksy, przekazując ich dokumenty specyfikacji, ale pojawia się błąd. Zamiast tego muszę podać nazwy indeksów.
Rozwiązanie
Aby rozwiązać ten problem, wystarczy podać nazwy indeksów zamiast ich specyfikacji:
db.posts.dropIndexes( [
"body_text",
"title_1"
] )
Wynik:
{ "nIndexesWas" : 3, "ok" : 1 }
To mówi nam, że indeksy zostały pomyślnie usunięte.
Sprawdź wyniki
Możemy uruchomić getIndexes()
ponownie, aby sprawdzić, czy indeksy już nie istnieją.
db.posts.getIndexes()
Wynik:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" } ]
Oba indeksy zostały usunięte zgodnie z oczekiwaniami.