1

集計で月と年でグループ化し、データのない月も返そうとしています。

:
期間が 01/01/2018 から 01/03/2018 で、評価を検索し、評価が 2 月にのみ存在する場合、1 月と 3 月は評価なしで取得したいと考えています。

$pipeline = [
      ['$match'=>[
            'rating'     => ['$exists' => true],
            'date' => [
                              '$gte' => $da->getStart(true),
                              '$lte' => $da->getEnd(true)
                            ],
                  ]
      ],
      ['$project' => [
              'year'  => [
                '$cond' =>  [
                    ['$ifNull' => [$date->appendDollarSing(), 0]],
                    ['$year' =>  $date->appendDollarSing()],
                    -1
                ],
              'month' => [
                '$cond' => [
                    ['$ifNull' => [$date->appendDollarSing(), 0]],
                    ['$month' =>  $date->appendDollarSing()],
                    -1
                ],
              'rating'  => ['$sum'  => '$rating'],
          ]
      ],
      ['$group' => [
                  '_id' => ['year' => '$year', 'month' =>'$month'],
                  'rating'  => ['$sum'  => '$rating'],
                  'count'   => ['$sum'  => 1],
                  ]
            ],
    ];

上記のクエリは、私が使用した評価が存在する月を評価に当てはめて返します。ただし、exists true を削除しても、評価のない月は取得されません。

4

0 に答える 0