保存后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"));
将是最好的和最不成问题的方式,使这项工作(使用蓝鸟承诺)。