如何replaceObjectId ref。 与来自MongoDB的实际对象(idealy在服务器端)?

这是主要对象的模式:

var newsSchema = new Schema({ headline: String, paragraph: String, imgURI: String, imgThumbURI: String, imgCaption: String, addedOn: Date, addedBy: { type: ObjectID, ref: 'usr' } }); var News = mongoose.model('news', newsSchema); 

…和addedBy的模式:

 var usr = new Schema({ username: String, avatar: { type: ObjectID, ref: 'avtr' }, href: String }); var UserModel = mongoose.model('usr', usr); 

到现在为止还挺好。 所有的作品。 然后在Angular客户端中检索新闻对象,但addedBy值不是所需的对象,而是一个ObjectId:

 { "headline":"Shocking news from the Neverland!", ... "addedBy":"520e9aac9ca114914c000003", // <-- the offender!! "addedOn":"2013-08-16T21:33:32.294Z", "_id":"520e9aac9ca114914c000001", "__v":0 } 

当我想要这样一个对象:

 { "headline":"Shocking news from the Neverland!", ... "addedBy":{ "username":"Peter" "avatar":{ "src":"../images/users/avatars/avatar1.png", "ststus":"happy"} } "addedOn":"2013-08-16T21:33:32.294Z", "_id":"520e9aac9ca114914c000001", "__v":0 } 

所以是的,我希望在主对象被发送到angular客户端之前,将所有嵌套的ObjectIdreplace为它们各自在数据库中的对象。 我正在构build的API非常复杂,如果angular度客户端可以从我的Express服务器接收一个已经准备好被引入范围的对象,那将是非常好的。
如何更改以下“/新闻”路线:

 app.get('/news', function(req, res, next){ News. find(). exec(function(err, nws){ if(err) {res.writeHead(500, err.message)} res.send(nws); }); }); 

为了完成这一点,所以我可以像这样从angular度完全访问完整的(嵌套的)对象:

 angular.module('App', ['ngResource']) .controller('NewsCtrl', function($scope, $resource){ var News = $resource('/news'); var news = News.query(); $scope.news = news; }); 

然后在网站上访问这样的api:

 <img class="avatar-img" src="{{ news[0].addedBy.avatar.src }}"> 

我非常感谢你的时间,欢呼Jared

正如@WiredPrairie所说,你需要使用填充函数Populate Mongoose Documentation

你的查询应该是这样的:

 app.get('/news', function(req, res, next){ News. find(). populate("addedBy"). exec(function(err, nws){ if(err) {res.writeHead(500, err.message)} res.send(nws); }); }); 

有很多不同的事情,你可以做填充,例如,只带来“addedBy”文件的用户名字段,你可以做

 populate("addedBy","username") 

或者如果你不想带一个特定的领域,像这样做:

 populate("addedBy","-username")