按日期间隔汇总数据

时间:2020-02-24 12:27:33

标签: javascript mongodb

这就是我进行汇总查询的方式,以获取开始时间和结束时间之间的平均时间(格式均为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分钟(对于1型组)。

2 个答案:

答案 0 :(得分: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
            ]
        }
        }
}}]

答案 1 :(得分:0)

检查是否符合您的要求:

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