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

如何编写MongoDB聚合查询:特定用户ID的统计与最大日期查询

MongoDB聚合查询实现你的需求

没问题,我帮你写一条能同时满足三个需求的MongoDB聚合查询语句,下面是完整的代码和详细解释:

db.yourCollection.aggregate([
  // 第一步:筛选指定用户ID的数据
  {
    $match: {
      user_id: { $in: ["111b/c", "111a"] }
    }
  },
  // 第二步:使用$facet并行执行两个聚合任务
  {
    $facet: {
      // 任务1:统计light_pad等于20的记录总数
      totalLightPad20: [
        { $match: { light_pad: 20 } },
        { $count: "count" }
      ],
      // 任务2:获取每个用户ID对应的最大日期数据
      userLatestData: [
        // 按日期降序排序,确保最新的记录排在前面
        { $sort: { date: -1 } }, // 注意:替换成你实际的日期字段名,比如create_time/update_time
        // 按用户ID分组,取每组的第一条(也就是最新日期的记录)
        {
          $group: {
            _id: "$user_id",
            latestRecord: { $first: "$$ROOT" }
          }
        },
        // 将最新记录转为根文档,方便查看
        { $replaceRoot: { newRoot: "$latestRecord" } }
      ]
    }
  }
])

关键部分解释:

  • $match阶段:先过滤出目标用户的数据,减少后续聚合的处理量。注意用户ID包含/,直接作为字符串写入$in数组即可,MongoDB会准确匹配。
  • $facet阶段:这是核心,它允许我们在一个聚合管道中同时执行多个独立的聚合任务,完美解决你既要统计总数又要获取每个用户最新数据的需求。
  • totalLightPad20分支:先再次过滤出light_pad=20的记录,再用$count统计数量。
  • userLatestData分支:先按日期降序排序,这样每个用户的最新记录会排在最前面;然后按用户ID分组,用$first: "$$ROOT"获取每组的第一条完整记录(也就是最大日期的那条);最后用$replaceRoot把嵌套的最新记录转为顶层文档,结构更清晰。

注意事项:

  • 把yourCollection替换成你实际的集合名称。
  • 把date替换成你数据中存储日期的字段名(比如create_time、update_time等)。
  • 如果你的日期字段是字符串格式,确保它是可排序的ISO格式(比如"2024-05-20T10:30:00Z"),否则$sort可能无法正确按日期排序。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:22:57