MongoDB聚合PHP,按天分组

时间:2014-08-20 15:55:12

标签: php mongodb mongodb-query aggregation-framework

我的数据库格式如下

Array
(
[_id] => MongoId Object
    (
        [$id] => 53f4bf0e8db0d31b0ba802df
    )

[userSession] => 580929792589634763f964479eee8721
[pageEnteredDate] => 1408548587
[pageLeftDate] => 1408548622
[userName] => User 1
[userId] => 33657
[pageView] => monitoring patients
[pageActions] => []
[pageTag] => 1-3-16-131-315
[timeSpent] => 35
)
Array
(
[_id] => MongoId Object
    (
        [$id] => 53f3d7008db0d33e61cae841
    )

[userSession] => e04e5081c9482654030bacf3c8c90b21
[pageEnteredDate] => 1408488536
[pageLeftDate] => 1408489216
[userName] => user 2
[userId] => 4278
[pageView] => Surgery Staff
[pageActions] => [["BUTTON","Comment",1408488701],["A","Discussion",1408488712]]
[pageTag] => 1-3-5-148
[timeSpent] => 680
)
Array
(
[_id] => MongoId Object
    (
        [$id] => 53f3d7008db0d33gj1cae841
    )

[userSession] => e04e5081c9482654030bahjhc8c90b21
[pageEnteredDate] => 1408488536
[pageLeftDate] => 1408489216
[userName] => user 3
[userId] => 428
[pageView] => Surgery Staff
[pageActions] => [["BUTTON","Comment",1408488701],["A","Discussion",1408488712]]
[pageTag] => 1-3-5-148
[timeSpent] => 680
)

pageEnteredDate是我想要使用的日期

我想按pagetag和day分组数据。我的意思是有一天我应该只获得相同的页面标签一次。

因此,从这3个数组中它应该只显示2,因为2具有相同的pageTag并且在同一天。

由于

***代码使用

$result = $this->collection->aggregate(
array(
    array(
        '$group' => array( 
            '_id'=> array( 'pageTag' => '$pageTag','day' => array('$subtract' => array('$pageEnteredDate', 86400))),
            'timeSpent' => array( '$sum' => '$timeSpent' ),
            'lastView' => array( '$max' => '$pageEnteredDate' )
        )
    ),
    array('$skip' => 0),
    array('$limit' => 20)
)

);

1 个答案:

答案 0 :(得分:0)

您的“日期”值似乎只是从纪元时间戳(不含毫秒)派生的数字。但是你真正想要做的就是通过$group申请aggregation framework,并按“日期”分组一些日期数学:

$result = $collection->aggregate(array(
    array(
        '$group' => array( 
            '_id' => array(
                'pageTag' => 'pageTag',
                'day' => array(
                    '$subtract' => array(
                        '$pageEnteredDate',
                        array('$mod' => array(
                            '$pageEnteredDate',
                            60 * 60 * 24
                        ))
                    )
                )
            ),
            'timeSpent' => array( '$sum' => '$timeSpent' ),
            'lastView' => array( '$max' => '$pageEnteredDate' )
        )
    )
));

基本上说要对“pageTag”值进行分组并使用“pageEnteredDate”来应用基本上将时间戳舍入到当前日期的数学运算,因此同一天内的所有值都是相同的。

您还没有确切地说明要在此处“分组”的内容,因此给出了将$sum应用于“timeSpent”值并使用$max来识别当天记录的最后一个时间戳值。

您可以通过这种方式使用任何"grouping operators"来满足您的需求