mongoDB PHP按日期和日期字段汇总集合

时间:2013-12-15 18:26:23

标签: php mongodb aggregation-framework

我正在尝试输出按日期分组的日期数组,其中包含一个名为minutes_numeric的字段的总和。

我目前的查询是:

return $this->db->Work->aggregate(array(
            array(
                '$match' => array(
                    'date' => array('$gt' => $start, '$lt' => $end)
                )
            ),
            array(
                '$project' => array(
                    'year' => array('$year' => '$date' ),
                    'month' => array('$month' => '$date' ),
                    'day' => array('$dayOfMonth' => '$date'),
                ),
            ),
            array(
                '$group' => array(
                    '_id' => array('year' => '$year', 'month' => '$month', 'day' => '$day'),
                    'minutes_numeric' => array('$sum' => 1)
                ),
            ),
            array(
                '$sort' => array(
                    '_id' => 1
                ),
            ),
            array(
                '$limit' => 30
            )
        ));

哪个输出:

{
result: [
{
_id: {
year: 2013,
month: 12,
day: 4
},
minutes_numeric: 40
},
{
_id: {
year: 2013,
month: 12,
day: 11
},
minutes_numeric: 127
},
{
_id: {
year: 2013,
month: 12,
day: 12
},
minutes_numeric: 108
}
],
ok: 1
}

哪个好,但minutes_numeric表示当天的行数,所以我更改了$group子句:

    array(
        '$group' => array(
            '_id' => array('year' => '$year', 'month' => '$month', 'day' => '$day'),
            'minutes_numeric' => array('$sum' => '$minutes_numeric')
        ),
    ),

然后将总和(minutes_numeric)更改为0而不是实际总和。

我不确定为什么我的总和出错了,非常感谢任何帮助


编辑,

如果我更新$ project以包含minutes_numeric,则总和似乎排除了$ match参数

 array(
            '$project' => array(
                'year' => array('$year' => '$date' ),
                'month' => array('$month' => '$date' ),
                'day' => array('$dayOfMonth' => '$date'),
                'minutes_numeric' => 1
            ),
        ),
        array(
            '$group' => array(
                '_id' => array('year' => '$year', 'month' => '$month', 'day' => '$day'),
                'minutes_numeric' => array('$sum' => '$minutes_numeric')
            ),
        )

1 个答案:

答案 0 :(得分:0)

如果这是您当前的查询

return $this->db->Work->aggregate(array(
            array(
                '$match' => array(
                    'date' => array('$gt' => $start, '$lt' => $end)
                )
            ),
            array(
                '$project' => array(
                    'year' => array('$year' => '$date' ),
                    'month' => array('$month' => '$date' ),
                    'day' => array('$dayOfMonth' => '$date'),
                    'minutes_numeric' => 1
                ),
            ),
            array(
                '$group' => array(
                    '_id' => array('year' => '$year', 'month' => '$month', 'day' => '$day'),
                    'minutes_numeric' => array('$sum' => '$minutes_numeric')
                ),
            ),
            array(
                '$sort' => array(
                    '_id' => 1
                ),
            ),
            array(
                '$limit' => 30
            )
        ));

那么你的$ match参数被“忽略”的唯一方法是结果不像你期望的那样可能是因为它们是错误的。尝试检查$ start和$ end的值,因为您使用的查询似乎是正确的。

如果不是问题,请使用当前查询的结果更新您的问题。 (如果查询与我的答案中的查询不同,也请更新您的查询)