Mongoose 使用聚合按数组中的日期对文档进行分组

时间:2021-02-04 07:51:37

标签: mongodb mongoose aggregation-framework grouping

我正在尝试了解 mongoose 中的 .aggregate 函数。我有以下模型,我尝试计算每天发生的点击次数。

var clickEvent = new Schema({
  createdAt: {type: Date},
  clicks: [{type: Date, _id: false}]
})

所以想象一下我有这样的多个文档:

[{
 createdAt: '2020-12-30T11:26:19.948+00:00',
 clicks: ['2021-01-27T15:58:37.109+00:00', '2021-01-28T15:58:37.109+00:00', 2021-01-28T15:58:37.109+00:00]
},

{
 createdAt: '2020-12-31T11:26:19.948+00:00',
  clicks: ['2021-01-24T15:58:37.109+00:00', '2021-01-22T15:58:37.109+00:00', 2021-01-28T15:58:37.109+00:00]
}]

我现在想找回类似的东西

 [{day: '24-01-2021', totalClicks: 10}, {day: '25-01-2021', totalClicks: 2}]

我尝试了以下

 await Event.aggregate([
    {
      $group : {
        _id :{ $dateToString: { format: "%Y-%m-%d", clicks: "$date"} },
        list: { $push: "$$ROOT" },
        totalClicks: { $sum: 1 }
      }
    }
  ])
}

然而这行不通。我相信这只有在点击次数不是数组而只是一个日期时才有效。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

  • $unwind 解构 clicks 数组
  • $toDate clicks 类型从字符串到日期类型
await Event.aggregate([
  { $unwind: "$clicks" },
  {
    $group: {
      _id: {
        $dateToString: {
          format: "%d-%m-%Y",
          date: { $toDate: "$clicks" }
        }
      },
      totalClicks: { $sum: 1 }
    }
  }
])

Playground