【发布时间】:2017-08-06 19:54:19
【问题描述】:
我有以下两个收藏:
1) Users: {name: xyz,
email:abc@xuz.com}
2) Posts: {_id: 12345678,
time:asdfg,
authEmail:abc@xyz.com,
description: asdigligvilud}
在这里,我想获取每个帖子的详细信息以及相应的作者 ID 名称。 所以我写了这样的查询:
// get all the posts
Posts.find((err, posts)=> {
if (err) { next(err) };
var data = Array();
var count = 0;
var len = posts.length;
// function to check the end of inner queries
var checkloop = function(){
count++;
if(count===len)
return res.json({result:data,
msg:'success'});
}
for(var i=0;i<len;i++){
Users.findOne({email:posts[count].authEmail},(err,usr)=>{
if(usr){
var item = {
'authorName':usr.name?
'email':usr.email,
'postDesc':posts[count].desc,
'creationTime':posts[count].time
}
data.push(item);
}
checkloop();
});
}
});
但是对于每个迭代,我得到相同的结果,即 post deatils 和 author id 对应于第一个循环,即仅是 posts[0]。 所以我认为这是因为查询的异步性质。是否有任何标准方法可以在 mongodb 中进行此类查询,或者我是否需要更改我的回调方法?
提前致谢。
【问题讨论】:
-
使用
$in而非循环进行one 查询。Users.find({ 'emai'l: { '$in': posts.map(p => p.authEmail) } },(err,users) => { ...。无需循环异步调用,也没有混乱。
标签: node.js mongodb synchronization mongodb-query mongoose-schema