如何使用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] } } } } } ])
各阶段说明
$addFields阶段:为每个文档新增isAnswered布尔字段,通过$exists操作符判断当前文档是否包含answer字段。$group阶段:以_id: null将所有文档归为同一组,使用$push配合$cond条件判断,分别将已回答、未回答的文档推入对应数组(不符合条件的文档推入null占位)。$project阶段:移除默认的_id字段,并用$filter过滤数组中的null值,得到纯净的分组结果。
如果不需要返回临时的isAnswered字段,可以在$push时指定需要保留的字段,示例如下:
// 在$group的$push中指定返回字段 $push: { $cond: [ { $eq: ["$isAnswered", true] }, { question: "$question", answer: "$answer", points: "$points" }, null ] }
内容的提问来源于stack exchange,提问作者vaibhav deep
相关产品推荐
相关产品推荐

