2016-07-29 85 views
0

我需要在PHP中执行它之前动态构建一个复杂的MongoDB查询。我的查询行看起来像$cursor = $c_sbc->aggregate($query_string);,其中$ query_string类似[['$match' => ['symbol' => $sym]],['$project' => ['first' => ['$arrayElemAt' => ['$data.1000', -1]]]]]使用变量来用PHP查询MongoDB

复制并粘贴上面给出的示例以替换$ query_string可得到所需的结果。但是,使用$ query_string在适当的位置运行会给出一个错误,指出它需要一个数组而不是一个字符串。我如何获得此查询的工作?

Catchable fatal error: Argument 1 passed to MongoDB\Collection::aggregate() must be of the type array, string given, called in C:\xampp\htdocs\gc5\screen.php on line 60 and defined in C:\xampp\htdocs\gc5\vendor\mongodb\mongodb\src\Collection.php on line 163 

编辑:有关PHP

$query = $_POST['screen']; 

    $t = array(
    "revenue" => 1000, 
    "costofgoodssold" => 1001 
); 

    $data_array = []; 

    //turn words into data.XXXX codes 
    function translate($match){ 
    global $t; 
    global $data_array; 
    foreach($match as $m){ 
     $d = "data.".$t[$m]; 
     $data_array[] = $d; 
     return $d; 
    } 
    } 

    $query = preg_replace('/\s/', '', $query); //strip whitespace 
    $query = strtolower($query); 
    $query = preg_replace_callback('/([A-Z]+)/i','translate', $query); 

    echo "<br>Query: "; 
    print_r($query); 
    echo "<br>"; 


    $client = new MongoDB\Client("mongodb://localhost:27017"); 
    $db = $client->gc_dev; 
    $c_sbc = $db->screenByCompany; 

    $for_years = [-1]; //default is TTM 
    $symbols = ['goog', 'fb', 'crmt', 'vlgea', 'ko', 'pep', 'flws']; 

    for($i=0;$i<count($symbols);$i++){ 
    $sym = $symbols[$i]; 
    for($j=0;$j<count($for_years);$j++){ 
     $k = $for_years[$j]; 

     //build query for data 
     $data_query = ""; 
     foreach($data_array as $d){ 
     if($data_query == ""){ //first go-around, no need for comma 
      $data_query .= "['first' => ['\$arrayElemAt' => ['$".$d."', ".$k."]]]"; 
     }else{ 
      //$data_query .= ",['second' => ['\$arrayElemAt' => ['$".$d."', ".$k."]]]"; 
     } 
     $query_string = "[['\$match' => ['symbol' => \$sym]],['\$project' => ".$data_query."]]"; 

     } 

     echo "<br>\$query_string: ".$query_string; 
     $cursor = $c_sbc->aggregate($query_string); 
     //$cursor = $c_sbc->aggregate([['$match' => ['symbol' => $sym]],['$project' => ['first' => ['$arrayElemAt' => ['$data.1000',-1]]]]]); 
     $cursor = iterator_to_array($cursor); 
     //var_dump($cursor); 
     echo "Cursor: ".$cursor[0]['first'] . "<br><br>"; 

    } 

结果:

Query: (data.1000-data.1001)>1,000 

$query_string: [['$match' => ['symbol' => $sym]],['$project' => ['first' => ['$arrayElemAt' => ['$data.1000', -1]]]]] 

Catchable fatal error: Argument 1 passed to MongoDB\Collection::aggregate() must be of the type array, string given, called in C:\xampp\htdocs\gc5\screen.php on line 60 and defined in C:\xampp\htdocs\gc5\vendor\mongodb\mongodb\src\Collection.php on line 163 
+1

尝试var_dump($ query_string);在$ cursor = ...调用之前,确保它符合你的期望。 –

+1

你可以显示你定义$ query_string的代码部分吗? –

回答

1

发现你的错误。你将$ query_string声明为一个字符串,而不是像函数聚合所要求的数组那样。您的代码是:

$ query_string =“[[''\ $ match'=> ['symbol'=> \ $ sym]],['\ $ project'=>”。$ data_query。“]]” ;

其替换为:

$ QUERY_STRING = [[ '\ $匹配'=> [ '符号'=> \ $符号]],[ '\ $项目'=> $ data_query]];