Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MongoDB使用$inc和$addToSet升级_Php_Mongodb - Fatal编程技术网

Php MongoDB使用$inc和$addToSet升级

Php MongoDB使用$inc和$addToSet升级,php,mongodb,Php,Mongodb,我的示例代码: <?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('

我的示例代码:

<?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 );

?>
刷新页面后,添加奇怪的数据:

> 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?谢谢。

如果我没弄错,您粘贴的代码每次都会以这种方式执行?
获取另一个ip条目的问题是
'$addToSet'=>array('visitors'=>array('ip'=>$ip))'$addToSet'=>array('visitors'=>array('ip'=>$ip))
,因为您的数组不包含仅包含ip的字段,它将插入另一个字段(您的字段还具有pageview属性)。您需要精确匹配。
不确定是否有针对这个问题的一些指导原则,但我认为您应该使用以下内容,如文档结构:

{{u id:ObjectId(…),…,访问者:{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)
更新您的文档。无论如何,您需要用其他字符替换这些点,否则它就不起作用了。

您的意图是每个IP地址有一个文档,还是每个url有一个文档(带有IP数组)?我更喜欢每个ip 1个文档,因为可以跟踪每个ip的命中率。我可以使用嵌套数组来完成,但我希望通过使用嵌入文档来实现这一点。谢谢。您当前的解决方案基于一个充满文档的数组。因此,您的方法可能有点错误(如果我正确理解的话)。事实上,您可以使用初始文档结构来完成此操作,但这可能没有它那么方便。我认为您的解决方案需要多个查询,这些查询可能会失败或导致数据重复,正如所描述的那样,因为同时对同一文档进行mongodb更新(尽管这未经测试,只是一个猜测)。为什么要使用填充了文档的数组而不是我的方法?也许我的示例搞错了,如果我把它截断了,很抱歉。这些点也表示表示您的其他数据:
{u id:ObjectId(…),date:“today”,url:“test/address.php”,访问者:{192.168.1.1:{pageview:1},10.2.42.1:{pageview:3}
> 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" } ] }