簡體   English   中英

MongoDB,PHP每天獲得唯一身份訪問者

[英]MongoDB, PHP getting unique visitors per day

我正在使用PHP和MongoDB創建一些分析腳本,但有點卡住了。 我想在特定時間段內每天獲得唯一身份的訪問者。

{
   "_id": ObjectId("523768039b7e7a1505000000"),
   "ipAddress": "127.0.0.1",
   "pageId": ObjectId("522f80f59b7e7a0f2b000000"),
   "uniqueVisitorId": "0445905a-4015-4b70-a8ef-b339ab7836f1",
   "recordedTime": ISODate("2013-09-16T20:20:19.0Z") 
}

要過濾的字段是uniqueVisitorId和recordedTime。

我已經在PHP中創建了一個初始化的數據庫對象,並且在構造對象時使它與數據庫建立了連接,然后使用在對象構造上創建的數據庫連接將MongoDB php函數簡單地映射到了公共函數。

無論如何,到目前為止,我每天的訪問人數是:

public function GetUniqueVisitorsDiagram() {
    // MAP
    $map = new MongoCode('function() {
        day = new Date(Date.UTC(this.recordedTime.getFullYear(), this.recordedTime.getMonth(), this.recordedTime.getDate()));
        emit({day: day, uniqueVisitorId:this.uniqueVisitorId},{count:1});
    }');
    // REDUCE
    $reduce = new MongoCode("function(key, values) {
            var count = 0;
            values.forEach(function(v) {
                count += v['count'];
            });
            return {count: count};
        }");
    // STATS
    $stats = $this->database->Command(array(
        'mapreduce' => 'statistics',
        'map' => $map,
        'reduce' => $reduce,
        "query" => array(
            "recordedTime" =>
                array(
                    '$gte' => $this->startDate,
                    '$lte' => $this->endDate
                )
            ),
            "out" => array(
                "inline" => 1
            )
        ));
    return $stats;          
}

如何正確過濾此數據以獲得唯一身份訪問者? 還是使用聚合會更好,如果可以的話,您是否願意幫助我提供代碼片段?

聚合框架中的$ group運算符正是為此用例而設計的,可能會快10到100倍。 在此處閱讀有關組運算符的信息: http : //docs.mongodb.org/manual/reference/aggregation/group/

以及此處的php驅動程序實現: http : //php.net/manual/zh/mongocollection.aggregate.php

您可以將$ group運算符與其他運算符結合使用,以進一步限制聚合。 最好您自己閱讀一下框架,以更好地了解正在發生的事情,因此,我不會為您提供完整的示例。

    $m=new MongoClient();
    $db=$m->super_test;
    $db->gjgjgjg->insert(array(
        "ipAddress" => "127.0.0.1",
        "pageId" => new MongoId("522f80f59b7e7a0f2b000000"),
        "uniqueVisitorId" => "0445905a-4015-4b70-a8ef-b339ab7836f1",
        "recordedTime" => new MongoDate(strtotime("2013-09-16T20:20:19.0Z"))
    ));
    var_dump($db->gjgjgjg->find(array('recordedTime'=>array('$lte'=>new MongoDate(),'$gte'=>new MongoDate(strtotime('-1 week')))))->count()); // Prints 1
    $res=$db->gjgjgjg->aggregate(array(
            array('$match'=>array('recordedTime'=>array('$lte'=>new MongoDate(),'$gte'=>new MongoDate(strtotime('-1 week'))),'uniqueVisitorId'=>array('$ne'=>null))),
            array('$project'=>array('day'=>array('$dayOfMonth'=>'$recordedTime'),'month'=>array('$month'=>'$recordedTime'),'year'=>array('$year'=>'$recordedTime'))),
            array('$group'=>array('_id'=>array('day'=>'$day','month'=>'$month','year'=>'$year'), 'c'=>array('$sum'=>1)))
    )); 
    var_dump($res['result']);

要完全回答這個問題:

    $m=new MongoClient();
    $db=$m->super_test;
    $db->gjgjgjg->insert(array(
        "ipAddress" => "127.0.0.1",
        "pageId" => new MongoId("522f80f59b7e7a0f2b000000"),
        "uniqueVisitorId" => "0445905a-4015-4b70-a8ef-b339ab7836f1",
        "recordedTime" => new MongoDate(strtotime("2013-09-16T20:20:19.0Z"))
    ));
    var_dump($db->gjgjgjg->find(array('recordedTime'=>array('$lte'=>new MongoDate(),'$gte'=>new MongoDate(strtotime('-1 week')))))->count()); // Prints 1
    $res=$db->gjgjgjg->aggregate(array(
            array('$match'=>array('recordedTime'=>array('$lte'=>new MongoDate(),'$gte'=>new MongoDate(strtotime('-1 week'))),'uniqueVisitorId'=>array('$ne'=>null))),
            array('$project'=>array('day'=>array('$dayOfMonth'=>'$recordedTime'),'month'=>array('$month'=>'$recordedTime'),'year'=>array('$year'=>'$recordedTime'))),
            array('$group'=>array('_id'=>array('day'=>'$day','month'=>'$month','year'=>'$year','v'=>'$uniqueVisitorId'), 'c'=>array('$sum'=>1))),
            array('$group'=>array('_id'=>array('day'=>'$_id.day','month'=>'$_id.month','year'=>'$_id.year'),'c'=>array('$sum'=>1)))
    )); 
    var_dump($res['result']);

我相信您所尋找的是與之接近的東西。

它將刪除一組以_id為日期的文檔,然后是當天唯一身份訪問者的數量,而不考慮id的數量,它僅檢測到id是否存在。

由於您每天都需要它,因此您實際上可以將dat部件$dayOfYear我認為的$dayOfYear一個字段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM