性別と年齢の幅を示すリクエストURLのクエリパラメータに応じてmongoDBのドキュメントを取得する機能を実装しています。
JavaScript
1const selectedQuestion = await Question.findById(req.params.id) 2 .populate({ 3 path: 'usersAnsweredA', 4 match: { gender: req.query.gender, age: { $gte: req.query.minAge, $lte: req.query.maxAge } }, 5 }) 6 .populate({ 7 path: 'usersAnsweredB', 8 match: { gender: req.query.gender, age: { $gte: req.query.minAge, $lte: req.query.maxAge } }, 9 });
クエリパラメータが含まれている場合には、上記の方法でドキュメントを取得できるのですが、クエリパラメータが含まれていない場合には取得ドキュメントが0件となってしまいます。
クエリパラメータが存在しない場合には、指定条件なしで取得したいのですが、これをmongooseのクエリで実現する方法はあるでしょうか?
JavaScript
1if (req.query.gender && req.query.minAge && req.query.maxAge) { 2 selectedQuestion = await Question.findById(req.params.id) 3 .populate({ 4 path: 'usersAnsweredA', 5 match: { gender: req.query.gender, age: { $gte: req.query.minAge, $lte: req.query.maxAge } }, 6 }) 7 .populate({ 8 path: 'usersAnsweredB', 9 match: { gender: req.query.gender, age: { $gte: req.query.minAge, $lte: req.query.maxAge } }, 10 }); 11 } else if (req.query.gender) { 12 selectedQuestion = await Question.findById(req.params.id) 13 .populate({ 14 path: 'usersAnsweredA', 15 match: { gender: req.query.gender }, 16 }) 17 .populate({ 18 path: 'usersAnsweredB', 19 match: { gender: req.query.gender }, 20 }); 21 } else if (req.query.minAge && req.query.maxAge) { 22 selectedQuestion = await Question.findById(req.params.id) 23 .populate({ 24 path: 'usersAnsweredA', 25 match: { age: { $gte: req.query.minAge, $lte: req.query.maxAge } }, 26 }) 27 .populate({ 28 path: 'usersAnsweredB', 29 match: { age: { $gte: req.query.minAge, $lte: req.query.maxAge } }, 30 }); 31 } else { 32 selectedQuestion = await Question.findById(req.params.id) 33 .populate({ 34 path: 'usersAnsweredA', 35 }) 36 .populate({ 37 path: 'usersAnsweredB', 38 }); 39 }
なお、上のようにif文で分岐させることで実現は可能ですが、コードがかなり長くなってしまうので、mongooseのクエリを使う方法があればご教授いただけると幸いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/17 10:58