MongoDB聚合查询:按标签分组生成标题数组及统计条数
正确的MongoDB聚合查询实现标签汇总需求
需求回顾
- 筛选出所有作者均已注册(
registered: true)的文档 - 按标签分组,每个标签输出:
tag: 标签名称titles: 所有包含该标签的符合条件文档的title数组size:titles数组的长度
原查询的问题
- 筛选条件错误:
{$all:[{$elemMatch:{registered:true}}]}仅能匹配存在至少一个注册作者的文档,无法确保所有作者都已注册 - 缺少分组聚合:没有用
$group按标签汇总标题,仅做了解构和投影,无法实现标签维度的汇总 size计算错误:原查询取的是作者数组的长度,而非需求中的标题数组长度
正确的聚合查询
db.posts.aggregate([ // 筛选所有作者都已注册的文档 { $match: { "authors.registered": { $not: { $eq: false } } } }, // 解构tags数组,每个标签生成单独文档 { $unwind: "$tags" }, // 按标签分组,收集对应的title数组 { $group: { _id: "$tags", titles: { $push: "$title" } } }, // 重命名字段并计算size { $project: { _id: 0, tag: "$_id", titles: 1, size: { $size: "$titles" } } } ])
各阶段说明
$match阶段:通过"authors.registered": { $not: { $eq: false } }确保数组中没有registered为false的作者,即所有作者都已注册$unwind阶段:将每个文档的tags数组拆分为多个文档,每个文档对应一个标签,方便后续分组$group阶段:以标签($_id: "$tags")为分组键,用$push把同标签的title收集成数组$project阶段:移除默认的_id字段,将分组键重命名为tag,同时用$size计算titles数组的长度作为size字段
内容的提问来源于stack exchange,提问作者Aatir Qureshi
相关产品推荐
相关产品推荐

