我有类似的问题": MongoDB, PHP getting unique visitors per day
我的php查询:
array(
array('$match' => array('date' => array('$gte' => $dateStart, '$lte' => $dateEnd))),
array('$project' => array('day' => array('$dayOfMonth' => '$date'))),
array('$group' => array('_id' => array('day' => '$day', 'uniqueVisitors' => '$ip'), 'count' => array('$sum' => 1))),
array('$group' => array('_id' => array('day' => '$_id.day'), 'count' => array('$sum' => 1))),
array('$sort' => array('_id.day' => 1)),
);
这显示只有1作为计数,如果我删除第二组数组,我得到ip计数但不是唯一的。谁能看到我的失败? :(
致以最诚挚的问候,
答案 0 :(得分:0)
您要复制的代码中有一些不必要的步骤,所以基本上您的管道应该是这样的
$pipeline = array(
array(
'$match' => array(
'date' => array('$gte' => $dateStart, '$lte' => $dateEnd )
)
),
array(
'$group' => array(
'_id' => array(
'day' => array( '$dayOfMonth' => '$date' ),
'uniqueVisitors' => '$ip'
)
)
),
array(
'$group' => array(
'_id' => '$_id.day',
'count' => array('$sum' => 1)
)
),
array( '$sort' => array('_id' => 1) )
);
第一个$group
缩小了实际的唯一性{" ip"愤怒中每月的每日价值。假设您在该范围内有一个月或以其他方式使用$dayOfYear
。
现在这些项目是"唯一的"在管道文档中,您只需将分组更改为" day"然后"计算"这些条目来自$sum
。
除了不必要的步骤之外,查询本身确实没有任何问题。你"匹配"文件," group"他们每天都有独特的IP"然后得到"计数"那些独特的比赛。
由于您的主要问题似乎是选择日期范围,因此这里有一些PHP代码片段来演示以下内容:
<?php
date_default_timezone_set('UTC');
$dt = new DateTime("2014-02-01", new DateTimeZone('PST'));
echo var_dump( $dt );
echo $dt->getTimestamp(), "\n";
$mongo = new MongoDate( $dt->getTimestamp() );
echo var_dump( $mongo );
echo json_encode( array( $mongo->sec ), "\n";
#echo $mongo->sec, "\n";
$new = new DateTime( date('Y-m-d', $mongo->sec ), new DateTimeZone('PST'));
echo var_dump ($new);
?>
这基本上是一点点&#34;然后再回来&#34;逻辑。但基本上我正在强制创建一个具有特定时区的新日期。然后在调用MongoDate时,我们使用getTimetamp()
方法,该方法从纪元开始返回秒作为构造函数的馈送器。根据定义,这始终是UTC,因此您可以轻松转换。