You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于用户所选分类从数据库获取帖子的API实现问询

基于用户预设分类获取帖子的优化实现

你的代码存在几个关键问题,导致无法正确过滤帖子,还会严重影响接口性能:

  1. 全量查询后内存过滤效率极低:先拉取所有帖子再做内存过滤,数据量大时会大幅拖慢响应速度
  2. 分类数组处理冗余且错误:用Promise.all包裹同步的map操作完全没必要,还把分类转换成了二维数组,直接导致后续过滤逻辑失效
  3. 过滤逻辑无效: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 21:15:36