Удаление каскадного стиля в Mongoose
Есть ли способ удалить все дочерние элементы родительского элемента в Mongoose, аналогично использованию внешних ключей MySQL?
Например, в MySQL я бы назначил внешний ключ и настроил его на каскад при удалении. Таким образом, если бы я должен был удалить клиента, все приложения и связанные пользователи также были бы удалены.
С верхнего уровня:
- Удалить клиента
- Удалить лотереи
- Удалить материалы
В лотереях и представлениях есть поле для client_id. Представления имеют поле для sweepstakes_id и client_id.
Сейчас я использую следующий код, и я чувствую, что должен быть лучший способ.
Client.findById(req.params.client_id, function(err, client) {
if (err)
return next(new restify.InternalError(err));
else if (!client)
return next(new restify.ResourceNotFoundError('The resource you requested could not be found.'));
// find and remove all associated sweepstakes
Sweepstakes.find({client_id: client._id}).remove();
// find and remove all submissions
Submission.find({client_id: client._id}).remove();
client.remove();
res.send({id: req.params.client_id});
});
Ответы
Ответ 1
Это один из основных вариантов использования Mongoose 'remove'
middleware.
clientSchema.pre('remove', function(next) {
// 'this' is the client being removed. Provide callbacks here if you want
// to be notified of the calls' result.
Sweepstakes.remove({client_id: this._id}).exec();
Submission.remove({client_id: this._id}).exec();
next();
});
Таким образом, при вызове client.remove()
это промежуточное программное обеспечение автоматически вызывается для очистки зависимостей.
Ответ 2
Если ваши ссылки хранятся иначе, скажем, client
имеет массив submission_ids
, то аналогичным образом, как принятый ответ, вы можете определить следующее на submissionSchema
:
submissionSchema.pre('remove', function(next) {
Client.update(
{ submission_ids : this._id},
{ $pull: { submission_ids: this._id } },
{ multi: true }) //if reference exists in multiple documents
.exec();
next();
});
который удалит идентификатор представления из справочных массивов клиентов <<24 > .