使用变量用PHP查询MongoDB

时间:2016-07-29 23:07:48

标签: php mongodb

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

复制并粘贴上面给出的示例以替换$ 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 个答案:

答案 0 :(得分:1)

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

$ query_string =“[['\ $ match'=&gt; ['symbol'=&gt; \ $ sym]],['\ $'''&gt;”。$ data_query。“]]”; < / p>

将其替换为:

$ query_string = [['\ $ match'=&gt; ['symbol'=&gt; \ $ sym]],['\ $ project'=&gt; $ data_query]];