Как вы удаляете модель из мангуста?

Я не имею в виду удалить документ или документы. Я имею в виду удалить модель целиком, чтобы мангуст больше не знал об этом. После объявления модели я не могу понять, как заставить мангуста забыть эту модель, чтобы ее можно было воссоздать.

mongoose.model('Book', bookSchema);
mongoose.model('Book', bookSchema);

В настоящее время вышесказанное создает исключение.

OverwriteModelError: Невозможно перезаписать модель "Книга" после компиляции.

Я хотел бы иметь возможность сделать что-то вроде этого...

mongoose.model('Book', bookSchema);
mongoose.removeModel('Book');
mongoose.model('Book', bookSchema);

... и не получить никаких ошибок. Есть идеи?

4 ответа

Решение

Попробуй это

delete mongoose.connection.models['Book'];

а затем перерегистрировать / повторно инициализировать его. это будет работать нормально

Похоже, что вам придется перезаписать часть исходного кода, чтобы иметь возможность удалить модель и добавить новую, поскольку Mongoose гарантирует, что модель не существует, прежде чем она захочет создать новую, что может или не может быть больше, чем вы хотите сделать:

if (this.models[name] && !collection) {
    // model exists but we are not subclassing with custom collection
    if (schema instanceof Schema && schema != this.models[name].schema) {
      throw new MongooseError.OverwriteModelError(name);
    }
    return this.models[name];
}

Строка 587 https://github.com/LearnBoost/mongoose/blob/master/lib/connection.js

Обновление автора вопроса:

Благодаря этому ответу я обнаружил, что вы можете получить доступ к моделям, определенным в соединении, через connection.models, В моем сценарии я тестировал плагин Mongoose с Mocha и хотел очистить модели между каждым модульным тестом.

afterEach(function () {
    mongoose.connection.models = {};
});

Вы можете использовать метод deleteModel

mongoose.deleteModel(modelName);

На самом деле это лучший способ избавиться от моделей, схем и коллекций в мангусте.

mongoose.connections.forEach(connection => {
  const modelNames = Object.keys(connection.models)

  modelNames.forEach(modelName => {
    delete connection.models[modelName]
  })

  const collectionNames = Object.keys(connection.collections)
  collectionNames.forEach(collectionName => {
    delete connection.collections[collectionName]
  })
})

const modelSchemaNames = Object.keys(mongoose.modelSchemas)
modelSchemaNames.forEach(modelSchemaName => {
  delete mongoose.modelSchemas[modelSchemaName]
})

Ссылка: https://github.com/Automattic/mongoose/issues/2874

Другие вопросы по тегам