集計で月と年でグループ化し、データのない月も返そうとしています。
例:
期間が 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 を削除しても、評価のない月は取得されません。