基于用户所选分类从数据库获取帖子的API实现问询
基于用户预设分类获取帖子的优化实现
你的代码存在几个关键问题,导致无法正确过滤帖子,还会严重影响接口性能:
- 全量查询后内存过滤效率极低:先拉取所有帖子再做内存过滤,数据量大时会大幅拖慢响应速度
- 分类数组处理冗余且错误:用
Promise.all包裹同步的map操作完全没必要,还把分类转换成了二维数组,直接导致后续过滤逻辑失效 - 过滤逻辑无效:
filter回调里返回map的结果(数组),而数组在布尔判断中永远为真,等于根本没做过滤
修正后的代码
// 基于分类获取视频帖子 router.get("/category/:id", async (req, res) => { try { // 查找用户,仅返回category字段减少数据传输 const user = await User.findById(req.params.id, "category"); if (!user) { return res.status(404).json("用户不存在"); } // 提取用户预设的分类名称数组 const userCategories = user.category.map(item => item.user); // 直接在数据库层面过滤匹配分类的帖子 const filteredPosts = await Post.find({ category: { $in: userCategories } }).lean(); // lean()返回普通JS对象,比Mongoose文档更轻便高效 res.status(200).json(filteredPosts); } catch (error) { console.error("获取帖子失败:", error); res.status(500).json("服务器内部错误"); } });
关键优化说明
- 数据库层面过滤:用MongoDB的
$in操作符直接匹配分类数组,避免全量拉取数据,性能提升明显 - 简化分类处理:直接从用户的category数组中提取分类名称,去掉多余的异步操作
- 完善错误处理:增加用户不存在的判断,同时打印错误日志便于排查问题
- 使用lean():如果不需要Mongoose文档的方法,用
lean()可以减少内存占用和序列化时间
额外建议
- 若帖子数量较多,建议添加分页逻辑(
limit()+skip()),避免一次性返回大量数据 - 给Post集合的
category字段建立索引,能进一步提升查询速度
内容的提问来源于stack exchange,提问作者Rajan Yt
相关产品推荐
相关产品推荐

