Как вы удаляете модель из мангуста?
Я не имею в виду удалить документ или документы. Я имею в виду удалить модель целиком, чтобы мангуст больше не знал об этом. После объявления модели я не могу понять, как заставить мангуста забыть эту модель, чтобы ее можно было воссоздать.
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]
})