我正在使用express,mongoose和mongodb构建一个restful API。它工作得很好,但我有一个问题,关于如何处理包含更多功能的请求,而不仅仅是在数据库中查找,删除或更新。我的用户模型如下所示:
var UserSchema = new Schema({
emailaddress: {type: String, unique: true},
firstname: String,
lastname: String,
password: String,
friends: [{type: Schema.Types.ObjectId, unique: true}]
});
正如您所看到的,friends数组只是一个ObjectIds数组。这些ObjectId引用数据库中的特定用户。如果我想要检索用户朋友的数组,我现在必须查找发出请求的用户,然后找到与friends数组中具有相同ID的所有用户。
现在看起来像这样:
methods.get_friends = function(req, res) {
//find user.
User.findOne({_id: req.params.id}, function(err, user, next) {
if(err) next(err);
if(user) {
console.log(user);
//find friends
User.find({_id: {$in: user.friends}}, {password: 0}).exec(function (err,
friends, next) {
if(err) next(err);
if(friends) {
res.send(friends);
};
});
}
是否可以在某种方法中单独查找用户并链接方法?我看到了关于中间件链接的一些内容,即app.get('/friends', getUser, getFriend)
,但这是否意味着我必须在我的中间件(getUser)方法中更改req对象然后将其传递给它?你会如何解决这个问题?您是否可以更改mongoose模型并保存所有朋友数据(意味着它可能会过时)或者您是否会创建一个方法getUser来返回您将收集朋友数据的承诺?
我将非常感谢能得到的所有帮助!
提前谢谢。
答案 0 :(得分:0)
Mongoose有一个名为population的功能,可以帮助解决这些问题。基本上,Mongoose将执行从数据库加载friends
文档所需的额外查询/查询:
User.findOne({_id: req.params.id})
.populate('friends')
.exec(function(err, user) {
...
});
这会将任何相关的朋友加载到user.friends
(作为数组)。
如果您想添加其他约束(在您的示例中为password : 0
),您也可以这样做:
User.findOne({_id: req.params.id})
.populate({
path : 'friends'
match : { password : 0 },
})
.exec(function(err, user) {
...
});