Node.js mongodb中的嵌套查询同步
我有以下两个收藏:Node.js mongodb中的嵌套查询同步,node.js,mongodb,synchronization,mongodb-query,mongoose-schema,Node.js,Mongodb,Synchronization,Mongodb Query,Mongoose Schema,我有以下两个收藏: 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((
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中是否有任何标准的查询方法,或者我是否需要更改回调方法
提前感谢。我相信您遇到的问题是因为for循环中的count可能是I。此外,每个循环迭代都会在Users.findOne回调中捕获相同的变量i,但是回调应该能够引用所查询的帖子。在不做太多更改的情况下,我认为在返回的帖子上使用forEach可以起到如下作用:
// 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'});
}
posts.forEach((post) => {
Users.findOne({email:post.authEmail},(err,usr)=>{
if(usr){
var item = {
'authorName':usr.name?
'email':usr.email,
'postDesc':post.desc,
'creationTime':post.time
}
data.push(item);
}
checkloop();
}
});
});
使用而不是循环进行一次查询。Users.find{'emai'l:{'in':posts.mapp=>p.authEmail}},err,Users=>{….不需要循环异步调用,也没有混乱。