mongodb php计算每天独特的ips

时间:2014-06-24 09:41:35

标签: php mongodb aggregation-framework

我有类似的问题": 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计数但不是唯一的。谁能看到我的失败? :(

致以最诚挚的问候,

1 个答案:

答案 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,因此您可以轻松转换。