2017-12-11 5 views
0

Mongooseで2つのクエリを1つに結合しようとしています。すべてのMongooseで複数のクエリを一度に実行

User.find({ _id: req.body.userId }, (err, user) => { 
    User.find({ username: decodedUser.username }, (err, member) => { 
    console.log("user\n", user) 
    console.log("member\n", member) 
}) 
}) 

私は、データベースへの単一User.find()問い合わせをしたいのですが、結果はオブジェクト(または配列)も:

今、私はこれをやっていますこの場合は[user, member]の配列のような、私が望むドキュメントです。これにより、User.find()を2回実行する必要がなくなります。理想的には、クエリの結果をオブジェクトにして、特定の要素を見つけるために反復処理する必要がある配列とは対照的に、特定のキー/値セットをより簡単に見つけることができます。 どうすればいいですか?

注:この作品:

resultsは私がしたい文書の配列です
User.find({ $or: 
    [ 
    { _id: req.body.userId }, 
    { username: decodedUser.username} 
    ]}, (err, results) => { 
    console.log("results\n", results) 
}) 

。しかし、よりよい方法があるかどうかを知りたいと思います。

答えて

1

両方の条件で1つの結果しか得られない場合は、User.findOneを使用できます。最初に見つかった結果が返されます。

User.findOne({ $or: 
    [ 
    { _id: req.body.userId }, 
    { username: decodedUser.username} 
    ]}, (err, user) => { 
    console.log("user\n", user) 
}) 

編集

あなたは2件の結果を取得する必要があり、あなたはまた、結果を得るために並行して使用約束で2つのクエリを実行することができ、結果で、その後持つようにしたいと言ったので、 。例えば。

Promise.all([ 
    User.find({ _id: req.body.userId }), 
    User.find({ username: decodedUser.username}) 
]).then(([ user, member ]) => { 
    console.log(util.format("user=%O member=%O", user, member)); 
}); 
+0

返信いただきありがとうございます。私は実際に2つの結果を期待しています。最後の目的は、上記の例のように 'User.find()'を2回実行するのではなく、1回の実行で2つの 'User.find()'クエリを実行することです。 – Farid

+0

あなたのソリューションは私にとって最高に見えます – Zilvinas

+0

はい!あなたの "編集"は、私がやろうとしていることです。ああ、ありがとう! – Farid

関連する問題