Подтвердить что ты не робот

Удаление каскадного стиля в 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});

});
4b9b3361

Ответ 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 > .