我的数据库格式如下
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)
)
);
答案 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"来满足您的需求