mongodb - handling - mongoose update middleware
Eliminar estilo Cascade en Mongoose (3)
Aquí hay otra forma que encontré
submissionSchema.pre(''remove'', function(next) {
this.model(''Client'').remove({ submission_ids: this._id }, next);
next();
});
¿Hay alguna manera de eliminar todos los hijos de un padre en Mongoose, de forma similar al uso de claves externas de MySQL?
Por ejemplo, en MySQL asignaría una clave foránea y la establecería en cascada en eliminar. Por lo tanto, si tuviera que eliminar un cliente, también se eliminarían todas las aplicaciones y usuarios asociados.
Desde un nivel superior:
- Eliminar cliente
- Eliminar sorteos
- Eliminar envíos
Sorteos y presentaciones tienen un campo para client_id. Las presentaciones tienen un campo para sweepstakes_id y client_id.
En este momento, estoy usando el siguiente código y siento que tiene que haber una mejor manera.
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});
});
En caso de que sus referencias se almacenen de otra manera, digamos que el client
tiene una matriz de submission_ids
, entonces de forma similar a la respuesta aceptada puede definir lo siguiente en 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();
});
que eliminará la identificación del envío de las matrices de referencia de los clientes en submission.remove()
.
Este es uno de los principales casos de uso del middleware ''remove''
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();
});
De esta manera, cuando llame a client.remove()
este middleware se invoca automáticamente para limpiar las dependencias.