[英]mongodb php count unique ips per day
我有一個類似的“問題”: MongoDB,PHP每天都吸引不重復的訪問者
我的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計數,但不是唯一的。 有人可以看到我的失敗嗎? :(
最好的祝福,
您要復制的代碼中有一些不必要的步驟,因此基本上您的管道應該這樣寫
$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
“計數”這些條目。
除了不必要的步驟外,查詢本身確實沒有錯。 您“匹配”文檔,將它們“分組”為“每天唯一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);
?>
基本上,這就是“反復執行”的邏輯。 但實際上,我是在強迫創建一個帶有特定時區的新日期。 然后,當調用MongoDate時,我們使用getTimetamp()
方法,該方法返回自紀元以來的秒數作為構造函數的饋送器。 根據定義,這始終是UTC,因此您可以輕松進行轉換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.