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

基于Express、Node、Mongo实现用户未答问题展示的最优方案咨询

问答Web应用未答问题展示方案

核心方案选择

毫无疑问,在数据库查询阶段直接排除已答问题是更优的方案,完全解决你担忧的扩展性和性能问题。应用层过滤的弊端非常明显:如果全局问题量或用户已答问题量较大,先拉取全量数据再在内存中过滤会产生大量无效数据传输,且内存遍历对比的效率会随着数据规模增长急剧下降,根本不适合长期扩展。

MongoDB具体实现示例

假设你的数据模型如下:

  • questions集合:存储所有问题,核心字段_id(问题ID)、content(问题内容)、domain(所属领域)
  • user_answers集合:存储用户答题记录,核心字段user_id(用户ID)、question_id(关联问题ID)、answer(用户答案)

方案1:基于$nin的基础查询

先获取用户已答问题ID列表,再查询排除这些ID的问题:

// Express路由示例
app.get('/questions/unanswered', async (req, res) => {
  const userId = req.user.id; // 假设已通过认证中间件获取当前用户ID

  // 提取用户已答问题ID
  const answeredIds = await UserAnswer.find(
    { user_id: userId },
    { question_id: 1, _id: 0 }
  ).then(records => records.map(item => item.question_id));

  // 查询未答问题,支持分页
  const unansweredQuestions = await Question.find({
    _id: { $nin: answeredIds }
  }).limit(20).skip(0); // 根据前端传入的页码调整skip值

  res.json(unansweredQuestions);
});

方案2:基于聚合查询的高效实现(推荐)

当用户已答问题数量较多时,$nin的参数列表过长会影响性能,此时用聚合查询的左连接过滤更高效:

app.get('/questions/unanswered', async (req, res) => {
  const userId = req.user.id;

  const unansweredQuestions = await Question.aggregate([
    // 左连接用户答题记录,仅匹配当前用户的记录
    {
      $lookup: {
        from: 'user_answers',
        localField: '_id',
        foreignField: 'question_id',
        as: 'user_answer',
        pipeline: [
          { $match: { user_id: mongoose.Types.ObjectId(userId) } }
        ]
      }
    },
    // 过滤掉存在答题记录的问题
    { $match: { user_answer: { $size: 0 } } },
    // 移除不需要的字段,减少返回数据量
    { $project: { user_answer: 0 } },
    // 分页限制
    { $limit: 20 }
  ]);

  res.json(unansweredQuestions);
});

性能优化要点

  • 索引优化:给user_answers集合创建复合索引db.user_answers.createIndex({ user_id: 1, question_id: 1 }),大幅提升用户答题记录的查询速度
  • 强制分页:无论哪种方案,都必须使用limit限制单次查询数量,避免全量数据查询
  • 缓存策略:对用户的已答问题ID列表或未答问题结果做短期缓存(如Redis),减少重复查询数据库的次数

合适的技术提问场所

国内可以选择SegmentFault(思否)、掘金问答区;国外除了Stack Overflow,还可以使用MongoDB官方论坛、Server Fault(针对服务器架构类问题),这些平台都是技术开发者集中交流的场所,能得到更精准的解答。

内容的提问来源于stack exchange,提问作者Manu Chadha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 03:52:55