Каков рекомендуемый способ удаления индексов с помощью Mongoose?
Мне нужно создать несколько сценариев развертывания, таких как перенос данных и привязки для базы данных MongoDB, и я не смог найти достаточно информации о том, как отбрасывать индексы с использованием API Mongoose. Это довольно прямолинейно при использовании официального API MongoDB:
Чтобы удалить все индексы в указанной коллекции:
db.collection.dropIndexes();
Однако я хотел бы использовать Mongoose для этого, и я попытался использовать executeDbCommand
, адаптированный из этот пост, но без успеха:
mongoose.connection.db.executeDbCommand({ dropIndexes: collectionName, index: '*' },
function(err, result) { /* ... */ });
Должен ли я использовать официальный API MongoDB для Node.js, или я просто что-то пропустил в этом подходе?
Ответы
Ответ 1
Чтобы сделать это с помощью модели Mongoose для коллекции, вы можете вызвать dropAllIndexes
собственной коллекции:
MyModel.collection.dropAllIndexes(function (err, results) {
// Handle errors
});
Обновление
dropAllIndexes
устарел в версии 2.x родного драйвера, поэтому вместо dropIndexes
:
MyModel.collection.dropIndexes(function (err, results) {
// Handle errors
});
Ответ 2
Похоже, вы пытаетесь удалить все индексы в данной коллекции.
В соответствии с документами MongoDB это правильная команда.
... Я попытался использовать executeDbCommand, адаптированный из этого сообщения, но без успеха:
Чтобы действительно помочь здесь, нам нужна дополнительная информация:
- Что не удалось? Как вы оценили "нет успеха"?
- Можете ли вы подтвердить 100%, что команда запущена? Вы выводили на журналы в обратном вызове? Вы проверили переменную
err
?
- Где вы создаете индексы? Можете ли вы подтвердить, что вы не воссоздаете их после удаления?
- Вы пробовали команду при перечислении имен конкретных индексов? Честно говоря, вы не должны использовать
"*"
. Вы должны удалить и создать очень специфические индексы.
Ответ 3
Если вы хотите сохранить свои индексы в определениях схемы с помощью mongoose (вы, вероятно, сделаете это, если используете mongoose), вы можете легко удалить те, которые больше не используются, и создать индексы, которые еще не существуют. Вы можете просто запустить await YourModel.syncIndexes()
на любых моделях, которые вам нужно синхронизировать. Он создаст в фоновом режиме с помощью .ensureIndexes
и отбросит все, что больше не существует в определении вашей схемы. Вы можете посмотреть полные документы здесь:https://mongoosejs.com/docs/api.html#model_Model.syncIndexes