2012-06-15 57 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