mongodb - Mongoose - フィルタリングのための日付の集計とグループ化

okwaves2024-01-25  10

mongoose でのデータ集約にいくつか問題があります。助けていただければ幸いです。

これが私の DB (最小化) です:

    {
        _id: 1,
        timestamp: 2018-05-27T22:02:07.837+00:00,
   },
   {
        _id: 2,
        timestamp: 2019-10-27T22:02:07.837+00:00,
    },
    {
        _id: 3,
        timestamp: 2019-12-27T22:02:07.837+00:00,
    },
    {
        _id: 4,
        timestamp: 2020-01-27T22:02:07.837+00:00,
    },
    {
        _id: 5,
        timestamp: 2020-02-27T22:02:07.837+00:00,
    },
    {
        _id: 6,
        timestamp: 2020-09-27T22:02:07.837+00:00,
    }

私が目指している構造は次のとおりです。

   [
      [2018,5],
      [2019,10],
      [2019,12],
      [2020,1],
      [2020,2],
      [2020,9]
    ]

現在のコードは次のとおりです:

  Model.aggregate([
    { $group: { _id: "$year", months: { $addToSet: "$month" } } }
  ]);

モンゴの遊び場

しかし、私が達成しようとしているものからはかなり遠いと感じています。 いくつかの洞察をいただければ幸いです。皆さん、ありがとう!!

これは必要ですか? mongoplayground.net/p/Xnl1iUSJ3fg

– Rfroes87

2020 年 9 月 5 日 1:35

1

@Rfroes87 正確には違います。新しいドキュメントを追加すると、それらも追加されることに注意してください。一意の年 + 月が必要です。数年間存在するブログを想像してください。投稿が書かれたすべての固有の月のリストを表示したいと考えています。 5 時間後、私は一人で解決策を思いつき、すぐに回答を投稿しました。

– ドール

2020 年 9 月 5 日 2:33



------------------------

5時間後、完成しました。 解決: https://mongoplayground.net/p/gFpFiK8vjkk

db.collection.aggregate([
          { $group: { _id: { year: { $year: "$timestamp" }, month: { $month: "$timestamp" } }, total: { $sum: 1 } } },
          { $sort: { "_id.year": -1, "_id.month": -1 } },
  
])

2

$unwind は必要ありません (配列で使用されます)。集計パイプラインの第 2 段階として並べ替えを使用することもできます: { $sort: { "_id.year": -1, "_id.month": -1 } }。また、第 3 段階と第 4 段階は必要ありません。

– prasad_

2020 年 9 月 5 日 8:41

@prasad_ おっしゃるとおりです。回答を更新します。有難うございます!これは、当初は別のデータ構造の応答を取得したかったのですが、あきらめたため、そこにありました。

– ドール

2020 年 9 月 5 日 10:46

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。