0

我一直在尝试使用 PHP 中的 mongo::command 来构建 MapReduce,但每次运行代码时都会出现以下错误:PHP Fatal Error, call to undefined method "mongo:command"

我的代码:

try {
    $map = new MongoCode("function() {
                    if (!this.tags) {
                        return;
                    }

                    for (index in this.tags) {
                        emit(this.tags[index], 1);
                    }");
    $reduce = new MongoCode("function(previous, current) {
                                var count = 0;

                                for (index in current) {
                                   count += current[index];
                                 }

                                return count;
                            }");
    $tags = $this->db->command(array(         //Line the error is found on
             "mapreduce" => "blog", 
             "map" => $map,
             "reduce" => $reduce));
    $con=$this->db->selectCollection($tags['result'])->find();
    var_dump($con);
}
catch(MongoCursorException $e) {
    echo "error message: ".$e->getMessage()."\n";
    echo "error code: ".$e->getCode()."\n";
}

请注意$this->db指的是我的连接(之前定义的)并且blog是集合。

作为参考,我使用过:http: //php.net/manual/en/mongodb.command.php

我使用的操作系统是 Ubuntu 12.04,我已经仔细检查了两个 php.ini 文件,它们都包含 mongo.so - 我可以使用 mongodb 进行正常查询,例如插入和获取数据,它只是命令似乎不起作用。

4

1 回答 1

0

你选择收藏吗$d = $m->demo;

php.net:

<?php
$m = new MongoClient();
$d = $m->demo;
$c = $d->poiConcat;

$r = $d->command(array(
'geoNear' => "poiConcat",      // Search in the poiConcat collection
'near' => array(-0.08, 51.48), // Search near 51.48°N, 0.08°E
'spherical' => true,           // Enable spherical search
'num' => 5,                    // Maximum 5 returned documents
));
print_r($r);
?>

我认为在您的代码中您没有选择集合 $d = $this->db->demo;放置集合名称而不是demo

try {
    $map = new MongoCode("function() {
                if (!this.tags) {
                    return;
                }

                for (index in this.tags) {
                    emit(this.tags[index], 1);
                }");
    $reduce = new MongoCode("function(previous, current) {
                            var count = 0;

                            for (index in current) {
                               count += current[index];
                             }

                            return count;
                        }");
     $d = $this->db->demo;// attention 
     $tags = $d->command(array(         //Line the error is found on
         "mapreduce" => "blog", 
         "map" => $map,
         "reduce" => $reduce));
     $con=$d->selectCollection($tags['result'])->find();
     var_dump($con);
}
catch(MongoCursorException $e) {
   echo "error message: ".$e->getMessage()."\n";
   echo "error code: ".$e->getCode()."\n";
}

编辑样本:我做这个样本看看

try {
   $map = new MongoCode("function() { emit(this.user_id,1); }");
   $reduce = new MongoCode("function(k, vals) { ".
      "var sum = 0;".
      "for (var i in vals) {".
         "sum += vals[i];". 
      "}".
      "return sum; }");
      $db=new Mongo("mongodb://sepidar:123@localhost:27017/admin");                 
      $d = $db->SepidarSoft_CBMS;// attention 
      $tags = $d->command(array(         //Line the error is found on
          'mapReduce'=>'RunUser',
          "map" => $map,
          "reduce" => $reduce,
          "out" => array('merge'=>'SepidarSoft_CBMS', 'db'=> 'RunUser')
      ));
      print_r($tags);
}
catch(MongoCursorException $e) {
     echo "error message: ".$e->getMessage()."\n";
     echo "error code: ".$e->getCode()."\n";
}

我的 mongodb 结构

结果

 Array
(
    [result] => Array
    (
        [db] => RunUser
        [collection] => SepidarSoft_CBMS
    )

    [timeMillis] => 2
    [counts] => Array
    (
        [input] => 1
        [emit] => 1
        [reduce] => 0
        [output] => 1
    )

    [ok] => 1
)
于 2013-05-04T15:03:55.323 回答