2016-07-29 65 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]];