Ако срещнете грешка „името на индекса трябва да бъде низ“ при изтриване на множество индекси в MongoDB, това вероятно е защото предавате документа със спецификации вместо името.
Когато използвате dropIndexes()
метод или dropIndexes
команда, за да премахнете множество индекси, трябва да предадете имена на индекса (не документите със спецификациите) в масив.
Примерни индекси
Да предположим, че имаме следните индекси:
db.posts.getIndexes()
Резултат:
[ { "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 } ]
Код на проблема
Ето пример за код, който причинява тази грешка:
db.posts.dropIndexes( [
{ "_fts" : "text", "_ftsx" : 1 },
{ "title" : 1 }
] )
Резултат:
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
В този пример се опитвам да изтрия два индекса, като предам техните спецификационни документи, но получавам грешка. Вместо това трябва да предам имената на индексите.
Решение
За да разреша този проблем, просто трябва да предам имената на индексите вместо техния документ за спецификация:
db.posts.dropIndexes( [
"body_text",
"title_1"
] )
Резултат:
{ "nIndexesWas" : 3, "ok" : 1 }
Това ни казва, че индексите са отпаднали успешно.
Проверете резултатите
Можем да изпълним getIndexes()
отново, за да проверите дали индексите вече не съществуват.
db.posts.getIndexes()
Резултат:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" } ]
И двата индекса бяха премахнати според очакванията.