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:
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});
});
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.
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()
.
Voici un autre moyen que j'ai trouvé
submissionSchema.pre('remove', function(next) {
this.model('Client').remove({ submission_ids: this._id }, next);
next();
});