Каков рекомендуемый способ удаления индексов с помощью 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