我正在为帖子提供JSON API,我希望在将post对象链接到相应的用户模型后传递它。
我有一个像这样的MongoDB架构:
User = {
email: String,
password: String
};
Post = {
user: ObjectId,
text: String
};
我没有发现链接单个帖子的问题,我使用以下代码完成了(我使用的是Mongoose和Express):
app.get('/api/posts/:id', function(req, res){
return Post.findById(req.params.id, function(err, post) {
if (!err) {
User.findById(post.user, function(err, user){
var joinedpost = {
text : post.text,
user : user
};
return res.send(joinedpost);
});
}
});
});
然而,当我想要服务多个帖子时,我面临以下问题:由于我在异步环境中工作,我不能简单地获取所有帖子并迭代它们以将每个帖子链接到其用户。
所以我认为我应该写两个查询,一个提取帖子,另一个连接它们,这样我就可以立即为它们服务。我对么?如果是这样,我怎么能实现呢?
答案 0 :(得分:1)
$in
运算符允许您在一个查询中执行此操作。这是我如何做到的(假设你使用下划线):
app.get('/api/posts', function(req, res){
return Post.find(function(err, posts) {
if (!err) {
var userIds = _.pluck(posts, user);
User.find({"id": {"$in": userIds}}, function(err, users){
var map = {};
_.each(users, function(u){
map[u.id] = u;
});
_.each(posts, function(p){
p.user = map[p.user];
});
return res.send(posts);
});
});
}
});
这未经过充分测试,您需要在User.find
电话上处理错误情况,但它应该是一个很好的起点。
此外,async
库对此类内容有很大帮助。你可以研究一下像waterfall
这样的方法来解决疯狂的嵌套回调问题。