MongoDB

【mongoose】日付のカラムで時間ごとにグループ化してドキュメント数をカウントする

タイトルのとおりです

model.aggregate()
    .project({
      h: { $hour: { createdAt } }
    })
    .group({
      _id: { hour: '$h' },
      count: { $sum: 1 }
    })

mongoose の aggregate メソッドは、MongoDB のAggregation Pipelineと同一です。

Aggregation Pipeline では合計やグループ化などさまざまな集計処理を行うことができます。

その中でも、日付に関する演算を行うことで、日付型のカラムを年単位、時間単位、秒単位などで表現できます。

$hour を使用することで、0〜23 の時間単位に変換し、その次の処理で変換した結果に対してグループ化することで時間単位でグループ化できます。

グループ別ドキュメント数を数えるために、{ $sum : 1 } とすることでカウントできます。

MongoDB の Version 5.0 からは$countで同様のことが行なえます。

例として、以下のような結果が返されます。

{
  {
    _id: {
      hour: 1
    },
    count: 11,
  },
  {
    _id: {
      hour: 2
    },
    count: 8,
  },
  {
    _id: {
      hour: 4
    },
    count: 30,
  },
}

該当する時間にドキュメントが存在しない場合には、結果自体が返されないので注意してください。

なおタイムゾーンを変更したい場合には以下のようにします。

      .project({
        h: { $hour: { $add: ['$createdAt', 9 * 60 * 60 * 1000] } }
      })

Contributors

> GitHub で修正を提案する
この記事をシェアする
はてなブックマークに追加

関連記事