【问题标题】:aggregate data by date interval按日期间隔聚合数据
【发布时间】:2020-02-28 09:01:41
【问题描述】:

这就是我如何进行聚合查询以获取开始时间和结束时间之间的平均时间(格式均为 ISODate("2020-02-24T13:08:00.123Z"))。

但我需要将结果数据分成两组,因为我需要获取开始时间为 04/2019 - 09/2020 的所有数据集的平均数据,第二组所有数据的开始时间为 10/2019 - 04/ 2020 年。 我不明白如何按这两个间隔对 ISODate 值进行分组

const data = await Data.aggregate([
    {
    $match: {
        type: { $exists: true },
        statsIgnore: { $exists: false }
    }
    },
    {
    $group: {
        _id: '$type',
        Datasets: { $sum: 1 },
        Average: {
        $avg: {
            $divide: [
            { $subtract: ['$timeEnd', '$timeStart'] },
            60000
            ]
        }
        }
    }
    }
]).toArray()

我的数据结构

[
    {
        _id: ObjectId("5d9242cf863feb0b8d70d12e"),
        timeStart: ISODate("2020-02-24T13:08:00.123Z"),
        timeEnd: ISODate("2020-02-24T13:18:00.123Z"),
        type: 'type1'
    },
    {
        _id: ObjectId("5d9242cf863feb0b8d70d12f"),
        timeStart: ISODate("2019-08-29T17:05:00.123Z"),
        timeEnd: ISODate("2019-08-29T17:25:00.123Z"),
        type: 'type1'
    }
]

在这个简单的数据示例中,只有一种类型,夏季使用单个数据集,冬季间隔使用单个数据集。

所以结果应该是冬季平均 10 分钟,夏季平均 20 分钟(对于 type1 组)。

【问题讨论】:

  • 对我来说,不清楚你想得到什么。预期的输出是什么?

标签: javascript mongodb


【解决方案1】:

我采用的方法是检查 timeStart 是否在您在初始 $match 阶段寻找的范围内。然后我添加了一个 $addFields 阶段,根据开始日期检查季节是否为夏季。然后我按我的新summer 字段分组。

[
{$match: {
  type: {
    $exists: true
  },
  statsIgnore: {
    $exists: false
  }, 
  timeStart: {
    $gte: ISODate("2019-04-01T00:00:00Z"),
    $lt: ISODate("2020-04-01T00:00:00Z")
  }
}}, 

{$addFields: {
  summer: { $lt: ["$timeStart", ISODate("2019-09-01T00:00:00Z")]}
}}, 

{$group: {
  _id: "$summer",
  Average: {
        $avg: {
            $divide: [
            { $subtract: ['$timeEnd', '$timeStart'] },
            60000
            ]
        }
        }
}}]

【讨论】:

    【解决方案2】:

    检查这是否符合您的要求:

    db.data.aggregate([
      {
        $match: {
          type: {
            $exists: true
          },
          statsIgnore: {
            $exists: false
          }
        }
      },
      {
        $group: {
          _id: {
            type: "$type",
            season: {
              $arrayElemAt: [
                [
                  "None",
                  "Winter",
                  "Winter",
                  "Spring",
                  "Spring",
                  "Spring",
                  "Summer",
                  "Summer",
                  "Summer",
                  "Autumn",
                  "Autumn",
                  "Autumn",
                  "Winter"
                ],
                {
                  $month: "$timeStart"
                }
              ]
            }
          },
          Datasets: {
            $sum: 1
          },
          Average: {
            $avg: {
              $divide: [
                {
                  $subtract: [
                    "$timeEnd",
                    "$timeStart"
                  ]
                },
                60000
              ]
            }
          }
        }
      }
    ])
    

    MongoPlayground

    【讨论】:

      猜你喜欢
      • 2014-08-23
      • 1970-01-01
      • 1970-01-01
      • 2020-04-16
      • 1970-01-01
      • 2021-09-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多