2012-06-15 84 views
0

我的示例代碼:

<?php 
$m = new Mongo(); 

$db = $m->selectDB('metrics'); 
$collection = new MongoCollection($db, 'counter'); 

$url = $_SERVER['REQUEST_URI']; 
$ip = '192.168.1.1'; 
$user = 'testuser'; 
$today = date('Y-m-d'); 

//upsert 1st 
$filter = array('url' => $url, 'date' => $today); 
$data2 = array(
       '$inc' => array("pageview" => 1), 
       '$addToSet' => array('visitors' => array('ip' => $ip)) 
); 
$options = array("upsert" => true); 
$collection->update($filter, $data2, $options); 


//update the pageview for unique ip after that 
$filter1 = array('url' => $url, 'date' => $today, 'visitors' => array('$elemMatch' => array('ip' => $ip))); 
$update1 = array('$inc' => array('visitors.$.pageview' => 1)); 
$collection->update($filter1, $update1); 

?> 

數據MongoDB中:

查看第1次的頁面時,這是正確的。

> db.counter.find(); 
{ "_id" : ObjectId("4fdaaf1176c5c9fca444ffd3"), "date" : "2012-06-14", "pageview" : 1, "url" : "/mongo/test.php", "visitors" : [ { "ip" : "192.168.1.1", "pageview" : 1 } ] } 

刷新頁面後,加入奇怪的數據:

> db.counter.find(); 
{ "_id" : ObjectId("4fdaaf1176c5c9fca444ffd3"), "date" : "2012-06-14", "pageview" : 2, "url" : "/mongo/test.php", "visitors" : [ { "ip" : "192.168.1.1", "pageview" : 2 }, { "ip" : "192.168.1.1" } ] } 

如何我會正確的查詢,並防止額外的IP被插入?謝謝。

+0

是否打算爲每個IP或每個URL的一個文檔(包含一組IP)創建一個文檔? –

+0

我更喜歡每個ip的1個文件,因爲可以跟蹤每個IP點擊數 – user1457750

回答

1

如果我知道了,你的粘貼代碼每次都以這種方式執行?
你得到另一個ip條目的問題是'$addToSet' => array('visitors' => array('ip' => $ip))'$addToSet' => array('visitors' => array('ip' => $ip)),因爲你的數組不包含只有一個ip的字段,它會插入另一個(你的字段另外還有一個pageview屬性)。你需要有一個完全匹配。
不知道那裏有一些指導對於這個問題,但我認爲你應該有這樣的事情去了,因爲文檔結構:

{_id:物件(.....),...,遊客:{ 192.168.1.1:{pageview:1}}。因此,您可以簡單地運行此更新命令(使用mongoshell語法),它將兩個更新進一步合併爲一個:):

db.c.update({"url":"/test.php","date":"today"},{$inc : {"192.168.1.1" : {pageview:1}, pageview: 1}},true)更新您的文檔。無論如何,你需要用其他角色替換這些點,否則就無法工作。

+0

我可以使用嵌套數組完成,但是我想通過使用嵌入文檔來實現此目的。謝謝。 – user1457750

+0

您當前的解決方案基於填充文檔的數組。所以你可能會在你的方法的錯誤軌道上(如果我正確地得到了你)。事實上,您可以使用您的初始文檔結構來完成這項工作,但這可能不夠方便。 我認爲你需要你的解決方案多個查詢可能會失敗或導致數據重複的描述,因爲對同一文檔的併發mongodb更新(雖然這是未經測試,只是一個猜測)。爲什麼你想使用一個文件填充的數組,而不是我的方法? – philnate

+0

也許你讓我的例子錯了,對不起,如果我截斷它錯了。這些圓點代表您的其他數據: '{_id:ObjectId(.....),date:「today」,url:「test/address.php」,訪客:{192.168.1.1:{pageview :1},10.2.42.1:{pageview:3}' – philnate