链接承诺更新Mongoose中的参考文档

鉴于以下模式:

user { uid:12345, name:myname, account=null } account { _id:6789, name:"myaccount", _owner:12345 } 

如何更新user.account以使其引用字段的值为account._owner。 当账户文件被创build时,我想查找并replaceuser.account的值。 我有这样的路线:

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

在我创build帐户的示例中,我想将user.account更新为6789(创build的帐户ID的值)

mongoose处理承诺: http : //mongoosejs.com/docs/promises.html

所以你可以简单地:

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

另一个解决scheme是将挂钩附加到帐户模型的save操作

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

那么你只需要创build一个新的账户对象,钩子将在后台执行。

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

国际海事组织,这些路线看起来更清洁,你可以试试看。