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

如何使用MongoDB Aggregate分组已回答与未回答的问题

MongoDB聚合实现已回答与未回答问题分组

针对你的需求,我们可以通过MongoDB的aggregate管道,结合$addFields、$group和$project三个阶段实现分组:

完整聚合查询语句

db.questions.aggregate([
  // 新增标记字段,判断文档是否包含answer字段
  {
    $addFields: {
      isAnswered: { $exists: ["$answer", true] }
    }
  },
  // 按标记分组,收集对应文档
  {
    $group: {
      _id: null,
      answered: {
        $push: {
          $cond: [{ $eq: ["$isAnswered", true] }, "$$ROOT", null]
        }
      },
      unanswered: {
        $push: {
          $cond: [{ $eq: ["$isAnswered", false] }, "$$ROOT", null]
        }
      }
    }
  },
  // 过滤数组中的空值,整理最终输出格式
  {
    $project: {
      _id: 0,
      answered: { $filter: { input: "$answered", cond: { $ne: ["$$this", null] } } },
      unanswered: { $filter: { input: "$unanswered", cond: { $ne: ["$$this", null] } } }
    }
  }
])

各阶段说明

  1. $addFields阶段:为每个文档新增isAnswered布尔字段,通过$exists操作符判断当前文档是否包含answer字段。
  2. $group阶段:以_id: null将所有文档归为同一组,使用$push配合$cond条件判断,分别将已回答、未回答的文档推入对应数组(不符合条件的文档推入null占位)。
  3. $project阶段:移除默认的_id字段,并用$filter过滤数组中的null值,得到纯净的分组结果。

如果不需要返回临时的isAnswered字段,可以在$push时指定需要保留的字段,示例如下:

// 在$group的$push中指定返回字段
$push: {
  $cond: [
    { $eq: ["$isAnswered", true] },
    { question: "$question", answer: "$answer", points: "$points" },
    null
  ]
}

内容的提问来源于stack exchange,提问作者vaibhav deep

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 20:10:28