Dado el siguiente esquema:
user { uid:12345, name:myname, account=null } account { _id:6789, name:"myaccount", _owner:12345 }¿Cómo puedo actualizar user.account para tener el valor de su campo de referencia account._owner? Cuando se crea el documento de la cuenta, quiero encontrar y reemplazar el valor de la cuenta de usuario. La ruta que tengo se ve así:
app.post('/accounts', authenticate, (req, res) => { var account = new Account({ name: req.body.name, _owner: req.body._owner, }); account.save().then((doc) => { //here i wasnt to update a refernce to a // an account field in a User document and set //it to the account.owner created above. res.send(doc); }, (e) => { res.status(400).send(e); }); });En mi ejemplo, cuando se crea la cuenta, quiero actualizar user.account a 6789 (el valor de la identificación de la cuenta creada)
Mangosta maneja promesas: http://mongoosejs.com/docs/promises.html
Así que simplemente puedes:
app.post('/accounts', authenticate, (req, res) => { var account = new Account({ name: req.body.name, _owner: req.body._owner, }); account.save() .then((doc) => User.findOneAndUpdate( { uid: req.body._owner }, { $set: { account: doc._id } }, { new: true } ) .then(() => doc); }).then((account) => { res.send(account); }, (e) => { res.status(400).send(e); }); });Otra solución sería adjuntar un gancho a la acción de save del modelo de cuenta.
var Owner = require('path/to/owner/model'); var schema = new Schema({name:String,_owner:{type: Schema.Types.ObjectId,ref: 'owner'}}); // ref will be useful if you want to use populate later schema.post('save', function(account) { return Owner.findOne({uid:account._owner}) .then(owner => { owner.account = account._id; // assign account id to user return owner.save(); }) });Luego solo tienes que crear un nuevo objeto de cuenta y el gancho lo hará en segundo plano.
app.post('/accounts', authenticate, (req, res) => { var account = new Account({ name: req.body.name, _owner: req.body._owner, }); account.save().then((doc) => { res.send(doc); }, (e) => { res.status(400).send(e); }); });En mi opinión, las rutas se ven más limpias de esta manera, podrías probarlo.