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

如何使用Mongo Aggregation获取带总条数的过去24小时记录

使用MongoDB聚合实现获取指定时间范围文档及总条数

嘿,这个需求用MongoDB的聚合框架就能完美解决!核心思路是通过$facet阶段同时处理两个任务:筛选并返回符合条件的文档,以及统计这些文档的总条数。这样一次聚合操作就能拿到你需要的所有结果,不用分开两次查询。

下面是具体的聚合管道代码:

db.getCollection("COLLECTION_NAME").aggregate([
  // 第一步:过滤出过去24小时内的记录,和你原来的find条件一致
  {
    $match: {
      createdAt: { $gt: new Date(Date.now() - 24*60*60*1000) }
    }
  },
  // 第二步:用$facet分两个管道处理数据
  {
    $facet: {
      // 第一个管道:获取所有匹配的文档(可以按需添加$project指定返回字段)
      data: [
        // 如果不需要所有字段,这里可以加$project,比如:
        // { $project: { _id: 1, createdAt: 1, otherField: 1 } }
      ],
      // 第二个管道:统计匹配文档的总条数
      total: [
        { $count: "count" }
      ]
    }
  },
  // 可选:把total数组里的count值提取出来,让结果更直观
  {
    $addFields: {
      total: { $arrayElemAt: ["$total.count", 0] }
    }
  }
])

代码解释:

  1. $match阶段:和你原来的find查询逻辑完全一致,只保留createdAt在过去24小时内的文档,减少后续处理的数据量。
  2. $facet阶段:这是关键,它允许我们在同一个聚合中运行多个独立的管道:
    • data管道:这里可以直接返回所有匹配的文档,如果需要精简返回字段,加上$project即可。
    • total管道:通过$count操作统计匹配文档的总数,结果会以[{ count: N }]的数组形式返回。
  3. $addFields阶段(可选):把total数组里的数值提取出来,让最终结果里的total直接是一个数字,而不是数组,使用起来更方便。

示例返回结果:

{
  "data": [
    { "_id": ObjectId("xxx"), "createdAt": ISODate("2024-05-20T10:00:00Z"), ... },
    { "_id": ObjectId("yyy"), "createdAt": ISODate("2024-05-20T11:30:00Z"), ... },
    // 更多匹配的文档
  ],
  "total": 15 // 假设总共有15条符合条件的记录
}

如果你不想用$facet,也可以用$group结合$push来实现,但$facet的写法更清晰易懂,尤其是当你需要同时处理多个统计需求时扩展性更好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:29:27