Удалите все индексы из всех коллекций в базе данных MongoDB с помощью командной строки

Я использовал mongorestore для восстановления базы данных, но я получаю сообщение об ошибке, что индекс уже существует, когда я пытаюсь запустить свое приложение.

Я знаю функцию db.collection.dropIndex (), но есть ли способ автоматизировать это и сразу удалить все индексы из всех коллекций в базе данных?

я пробовал

db.getCollectionNames().forEach(function(col_name) {   
   var coll = db.getCollection(col_name);   
   coll.dropIndexes(); 
});

Но это не помогает. Любые идеи?


person Simon    schedule 16.06.2014    source источник
comment
Затем перейдите к db.dropDatabase; команда, если вы хотите начать со свежей базой данных ... !!!   -  person RubyOnRails    schedule 16.06.2014
comment
Иногда я возвращаюсь, чтобы прочитать комментарий выше от @RubyOnRails, чтобы убедиться, что я никогда не буду давать подобные комментарии никому из моих младших разработчиков.   -  person Simon    schedule 21.01.2021
comment
Это случилось со мной с моим приложением Spring. Если вы используете Spring, вы можете попробовать обновить драйверы MongoDB. Я думаю, что новые драйверы решают эту проблему, но я не уверен, так как я использовал приведенное ниже решение для уничтожения и воссоздания всех своих индексов. Если бы у меня было больше времени, и я не был бы таким Ооооо нет! Производство остановлено! Я бы сначала попробовал обновить драйверы MongoDB в контролируемой тестовой среде.   -  person Brian Stinar    schedule 04.04.2021


Ответы (2)


Ваша команда работает для меня (она удаляет все индексы в выбранной в данный момент БД). Но вы также можете использовать эту альтернативу.

db.getCollectionNames().forEach(function(collName) { 
    db.runCommand({dropIndexes: collName, index: "*"});
});

При удалении индексов будут отброшены только индексы, отличные от _id.

Временное решение - удалить базу данных и установить флаг --noIndexRestore при восстановлении с помощью mongorestore, чтобы индексы не восстанавливались.

От man mongorestore:

--noIndexRestore

Новое в версии 2.2.

Запрещает mongorestore восстанавливать и создавать индексы, как указано в соответствующих выходных данных mongodump.

person Christian P    schedule 16.06.2014

Вы можете использовать эту команду, чтобы удалить все индексы из всех коллекций:

db.getCollectionNames().forEach(function (d) {
   db[d].dropIndexes();
});

Попробуй это!

Ссылка для справки

person Rahul Mankar    schedule 31.05.2017