保存后mongoose填充

我无法在新保存的对象上手动或自动填充创build者字段…我唯一可以find的方法是重新查询我已经拥有的对象,而我不想这么做。

这是设置:

var userSchema = new mongoose.Schema({ name: String, }); var User = db.model('User', userSchema); var bookSchema = new mongoose.Schema({ _creator: { type: mongoose.Schema.Types.ObjectId, ref: 'User' }, description: String, }); var Book = db.model('Book', bookSchema); 

这是我拉我的头发的地方

 var user = new User(); user.save(function(err) { var book = new Book({ _creator: user, }); book.save(function(err){ console.log(book._creator); // is just an object id book._creator = user; // still only attaches the object id due to Mongoose magic console.log(book._creator); // Again: is just an object id // I really want book._creator to be a user without having to go back to the db ... any suggestions? }); }); 

编辑:最新的mongoose修复这个问题,并添加填充function,看到新的接受的答案。

您应该可以使用模型的填充函数来执行此操作: http : //mongoosejs.com/docs/api.html#model_Model.populate在book的保存处理程序中,而不是:

 book._creator = user; 

你会做这样的事情:

 Book.populate(book, {path:"_creator"}, function(err, book) { ... }); 

可能来不及回答你的帮助,但是最近我被困住了,这可能对别人有用。

如果有人仍然在寻找这个。

Mongoose 3.6引入了很多很酷的function来填充:

 book.populate('_creator', function(err) { console.log(book._creator); }); 

要么:

 Book.populate(book, '_creator', function(err) { console.log(book._creator); }); 

请参阅: https : //github.com/LearnBoost/mongoose/wiki/3.6-Release-Notes#population

但是这样你仍然可以再次查询用户。

一个小技巧来完成它没有额外的疑问将是:

 book = book.toObject(); book._creator = user; 

只是为了阐述和举另一个例子,因为它帮助了我。 这可以帮助那些希望在保存后检索部分填充对象的人。 这个方法也有些不同。 花了一两个多小时寻找正确的方法来做到这一点。

  post.save(function(err) { if (err) { return res.json(500, { error: 'Cannot save the post' }); } post.populate('group', 'name').populate({ path: 'wallUser', select: 'name picture' }, function(err, doc) { res.json(doc); }); }); 

解决scheme返回一个承诺(没有callback):

使用文档#填充

 book.populate('creator').execPopulate(); // summary doc.populate(options); // not executed doc.populate(options).execPopulate() // executed, returns promise 

可能的实施

 var populatedDoc = doc.populate(options).execPopulate(); var populatedDoc.then(doc => { ... }); 

阅读关于文件人口在这里 。

不幸的是,这是一个我认为还没有解决的mongoose问题:

https://github.com/LearnBoost/mongoose/issues/570

你可以做的是写你自己的自定义getter / setter(并设置真正的 _customer在一个单独的属性)为此。 例如:

 var get_creator = function(val) { if (this.hasOwnProperty( "__creator" )) { return this.__creator; } return val; }; var set_creator = function(val) { this.__creator = val; return val; }; var bookSchema = new mongoose.Schema({ _creator: { type: mongoose.Schema.Types.ObjectId, ref: 'User', get: get_creator, set: set_creator }, description: String, }); 

注:我没有testing它,它可能奇怪的工作与.populate和设置纯ID。

可能是某事 喜欢

 Book.createAsync(bookToSave).then((savedBook) => savedBook.populateAsync("creator")); 

将是最好的和最不成问题的方式,使这项工作(使用蓝鸟承诺)。