Mongoose+Node.js环境下如何通过req.query用ObjectId查询用户关联的所有文章
解决方法
你当前的Post模型中username字段存储的是关联User模型的ObjectId类型,原代码直接用请求拿到的参数匹配该字段会因为类型/值不匹配返回空结果,可根据前端传参的不同选择以下两种方案:
方案1:前端传递用户ObjectId(性能最优,推荐)
如果前端点击用户名时,可直接获取到对应用户的_id作为user查询参数传入接口,直接修改查询逻辑即可。如果你已经在Post模型的schema中配置了username字段的自动populate,代码中的populate部分可以省略。
const mongoose = require('mongoose'); // 确保已引入mongoose router.get("/", async(req, res) => { const userId = req.query.user; // 这里参数实际传入的是用户ObjectId,可自行改名提高可读性 const catName = req.query.cat; try { let posts; if(userId) { // 直接用ObjectId匹配Post中关联用户的字段,mongoose会自动转换字符串格式的ObjectId posts = await Post.find({ username: userId }) .populate('username', 'username avatar'); // 第二个参数指定要返回的User字段,按需调整 } else if(catName) { posts = await Post.find({ categories: { $in: [catName] } }) } else { posts = await Post.find().populate('username', 'username avatar'); } res.status(200).json(posts) } catch(err) { res.status(500).json(err) } })
特殊场景下如果需要显式转换类型,可使用mongoose.Types.ObjectId(userId)处理参数。
方案2:前端传递用户名字符串
如果前端只能传用户名字符串作为user参数,需要先查询User表拿到对应用户的ObjectId,再关联查询Post:
const User = require('../models/User'); // 引入你自己定义的User模型 router.get("/", async(req, res) => { const username = req.query.user; const catName = req.query.cat; try { let posts; if(username) { // 先查User表获取对应用户的_id const user = await User.findOne({ username: username }); if (!user) { return res.status(404).json({ message: '用户不存在' }); } // 用用户_id查询关联的Post posts = await Post.find({ username: user._id }) .populate('username', 'username avatar'); } else if(catName) { posts = await Post.find({ categories: { $in: [catName] } }) } else { posts = await Post.find().populate('username', 'username avatar'); } res.status(200).json(posts) } catch(err) { res.status(500).json(err) } })
可选优化:你的Post模型里关联用户的字段命名为
username可读性较差,容易和实际用户名字段混淆,建议后续改成author或者userId降低维护成本。
内容的提问来源于stack exchange,提问作者kinhs
相关产品推荐
相关产品推荐

