2017-11-02 15 views
0

私はマングースで1つのコレクション(メッセージ)を照会します。結果は文書の配列です。各ドキュメントには、異なるコレクション(ユーザー)のIDが含まれています。今私は、メッセージコレクションから各IDのユーザーコレクションを照会したいと思います。 アイデアは、フロントエンドに返す前に、各メッセージオブジェクトをユーザーコレクションの情報で更新することです。 私はasync.eachを使ってみました。コールバック()関数が各繰り返しの後に呼び出されていることを確認しているにもかかわらず、何らかの理由で最終関数が呼び出されることはありません。IDの配列を持つmongooseでmongodbを照会する最良の方法は何ですか?

app.get('/getmsg', function(req, res){ 

messages.find({query}) 
.exec(function(err, ms){ 
    if(err) throw err; 
    async.each(ms, function(m, callback){ 
    users.findOne({_id : m.userId}) 
    .lean() 
    .exec(function(err, user){ 
     if(err) { 
     console.log('error' , err); 
     callback(); 
     } else { 
     m.userName = user.name; 

// everything is working up to here 

    callback(); 
    } 
    }), function(err){ 
     res.send(ms); // this is never returned! 
    } 
}); 
}); 

});

これを達成するより良い方法はありますか?私はこれが共通の問題でなければならないと考えています。

ありがとうございます!

+1

['$ in'](https://docs.mongodb.com/manual/reference/operator/query/in/)。調べる。 –

+1

また、 'messages.find({query})'はひどく間違っています。これは '.find({" query ":query})' 'に展開されます。' 'query ''というドキュメントに実際にプロパティを持たない限り、 '.find(query)'が必要な場所です。あなたはおそらくそうではありません。 –

+1

単に 'users.find({" _id ":{" $ in ":ms.map(m => m.userId)}})'です。ループする必要はありません。それを見て怠惰な人のために。 –

答えて

0

res.sendは使用できません。代わりに、通知を受け取る関数を作成します。このようなもの。

// 1st para in async.each() is the array of items 
async.each(items, 
// 2nd param is the function that each item is passed to 
function(item, callback){ 
// Call an asynchronous function, often a save() to DB 
item.someAsyncCall(function(){ 
    // Async call is done, alert via callback 
    callback(); 
}); 
}, 
// 3rd param is the function to call when everything's done 
function(err){ 
// All tasks are done now 
doSomethingOnceAllAreDone(); 
} 
); 
関連する問題