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

MongoDB聚合查询:如何在$lookup中实现每日数据平均值计算

修改聚合查询以返回每日数据平均值

你需要在$lookup的子管道中添加$group阶段,按日期分组计算平均值,替换原有的$sort(或调整顺序)。以下是修改后的完整代码:

Sensor.aggregate([
  {
    $match: { _id: ObjectId(req.params.id) },
  },
  {
    $lookup: {
      from: "sensordatas",
      as: "daily_avg_data",
      let: { device_id: "$device_id" },
      pipeline: [
        {
          $match: {
            $expr: {
              $and: [
                { $eq: ["$device_id", "$$device_id"] },
                { $gte: ["$datum", moment(startdate).toDate()] },
                { $lte: ["$datum", moment(enddate).toDate()] },
              ],
            },
          },
        },
        // 按日期分组计算平均值
        {
          $group: {
            _id: {
              // 将datum格式化为YYYY-MM-DD的日期字符串作为分组键
              date: { $dateToString: { format: "%Y-%m-%d", date: "$datum" } }
            },
            // 替换为你实际需要计算平均值的字段名,比如reading、value等
            avg_value: { $avg: "$your_numeric_field" }
          }
        },
        // 按日期排序(可选,根据需求调整顺序)
        { $sort: { "_id.date": 1 } },
        // 可选:重命名字段让结果更直观
        {
          $project: {
            _id: 0,
            date: "$_id.date",
            avg_value: 1
          }
        }
      ],
    },
  },
])

关键修改说明:

  1. 移除无用变量:原let中的datum没有实际作用,直接删除简化逻辑。
  2. 添加$group阶段:
    • 用$dateToString把时间字段datum转换为YYYY-MM-DD格式的字符串,作为每日分组的唯一标识。
    • 通过$avg操作符计算目标数值字段的每日平均值,记得把$your_numeric_field替换成集合中实际存储传感器数据的字段名(比如temperature、humidity等)。
  3. 可选优化:
    • $project阶段将分组用的_id.date重命名为date,移除冗余的_id字段,让返回结构更简洁。
    • $sort阶段按日期升序排列结果,可改为-1实现降序。

修改后,查询会返回指定时间范围内的每日平均值,数据量会大幅降低。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 03:15:32