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

MongoDB聚合查询:按标签分组生成标题数组及统计条数

正确的MongoDB聚合查询实现标签汇总需求

需求回顾

  • 筛选出所有作者均已注册(registered: true)的文档
  • 按标签分组,每个标签输出:
    • tag: 标签名称
    • titles: 所有包含该标签的符合条件文档的title数组
    • size: titles数组的长度

原查询的问题

  1. 筛选条件错误:{$all:[{$elemMatch:{registered:true}}]}仅能匹配存在至少一个注册作者的文档,无法确保所有作者都已注册
  2. 缺少分组聚合:没有用$group按标签汇总标题,仅做了解构和投影,无法实现标签维度的汇总
  3. 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" }
    }
  }
])

各阶段说明

  1. $match阶段:通过"authors.registered": { $not: { $eq: false } }确保数组中没有registered为false的作者,即所有作者都已注册
  2. $unwind阶段:将每个文档的tags数组拆分为多个文档,每个文档对应一个标签,方便后续分组
  3. $group阶段:以标签($_id: "$tags")为分组键,用$push把同标签的title收集成数组
  4. $project阶段:移除默认的_id字段,将分组键重命名为tag,同时用$size计算titles数组的长度作为size字段

内容的提问来源于stack exchange,提问作者Aatir Qureshi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 22:35:06