web-dev-qa-db-fra.com

Suppression de style en cascade dans Mongoose

Existe-t-il un moyen de supprimer tous les enfants d'un parent dans Mongoose, comme si vous utilisiez des clés étrangères MySQL?

Par exemple, dans MySQL, j'attribuais une clé étrangère et la configuraisais en cascade lors de la suppression. Ainsi, si je supprimais un client, toutes les applications et les utilisateurs associés seraient également supprimés.

De haut niveau:

  1. Supprimer le client
  2. Supprimer le concours
  3. Supprimer les soumissions

Les concours et les soumissions ont tous deux un champ pour client_id. Les soumissions ont un champ pour sweepstakes_id et client_id.

À l’heure actuelle, j’utilise le code suivant et j’estime qu’il doit y avoir un meilleur moyen.

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});

});
34
Nick Parsons

C’est l’un des principaux cas d’utilisation du 'remove'middleware de Mongoose.

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();
});

Ainsi, lorsque vous appelez client.remove(), ce middleware est automatiquement appelé pour nettoyer les dépendances.

91
JohnnyHK

Si vos références sont stockées différemment, par exemple, client a un tableau de submission_ids, puis, de la même manière qu'une réponse acceptée, vous pouvez définir ce qui suit sur 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();
});

qui supprimera le soumission id des tableaux de référence des clients sur submission.remove().

7
Talha Awan

Voici un autre moyen que j'ai trouvé

submissionSchema.pre('remove', function(next) {
    this.model('Client').remove({ submission_ids: this._id }, next);
    next();
});
0
Sam Bellerose