2016-06-13 79 views
1

我使用MongoChef構建一個聚合管道命令,該命令執行$match,然後執行$group,然後執行$project將工作的MongoDB聚合管道查詢轉換爲PHP時遇到問題

下面的代碼產生正確的輸出,並在MongoDB中本身確認工作:

db.collection_name.aggregate(
    [ 
    { 
     $match: { 
      ":energy_mon_id" : 9 
     } 
    }, 
    { 
     $group: { 
      "_id" : { 
       "Date" : "$:date" 
      }, 
      "avg_voltage_a" : { 
       "$avg" : "$:voltage_a" 
      }, 
      "avg_voltage_b" : { 
       "$avg" : "$:voltage_b" 
      }, 
      "avg_voltage_c" : { 
       "$avg" : "$:voltage_c" 
      } 
     } 
    }, 
    { 
     $project: { 
      "avg_volt" : { 
       "$add" : [ 
        "$avg_voltage_a", 
        "$avg_voltage_b" 
       ] 
      } 
     } 
    }, 
    { 
     $match: { 
     } 
    } 
    ] 
); 

所產生的這種輸出(注意:avg_volt values are integers):

{ "_id" : { "Date" : "2016-06-06" }, "avg_volt" : 779 } 
{ "_id" : { "Date" : "2016-06-08" }, "avg_volt" : 779 } 

現在的問題我面臨的是讓這個在PHP中正確運行。

我的PHP代碼如下:

$collection = $this->db->testdb->collection_name; 

    $aggrCommand = array(
     array(
     '$match' => array(":energy_mon_id" => 9) 
    ), 
    array( 
     '$group' => array( 
     "_id" => array( 
      "Date" => "$:date" 
     ), 
     "avg_voltage_a" => array( 
      '$avg' => "$:voltage_a" 
     ), 
     "avg_voltage_b" => array( 
      '$avg' => "$:voltage_b" 
     ), 
     "avg_voltage_c" => array( 
      '$avg' => "$:voltage_c" 
     ), 
     ) 
    ), 
    array(
     '$project' => array(
     "avg_volt" => array(
      '$add' => ["$avg_voltage_a","$avg_voltage_b" ] 
     ) 
     ) 
    ) 
    ); 

    $list = $collection->aggregate($aggrCommand); 

我得到的錯誤是這個最後一行,當我嘗試通過郵差提交一個GET請求:

Slim Application Error 
The application could not run because of the following error: 
Details 
Type: MongoDB\Driver\Exception\RuntimeException 
Code: 16554 
Message: $add only supports numeric or date types, not String 
File: C:\wamp\www\DRM\vendor\mongodb\mongodb\src\Operation\Aggregate.php 
Line: 168 

這是沒有意義的完全是因爲MongoDB中的輸出是一個整數值,並且我無法在轉換爲PHP時發現任何錯誤。

有一點需要注意的是,我的字段名稱在前面確實包含冒號(這不是一個錯誤),但我認爲這不是問題。

我真的難住這個,有人可以提供任何意見,如何解決這個問題呢?我的MongoDB命令的輸出顯然不是字符串,但在PHP中它表示avg_voltage_a和avg_voltage_b的值是字符串。這完全沒有意義。

回答

-2

在你的「$添加」聲明單引號儘量避免PHP解釋「$ avg_voltage_a」作爲一個變量:

'$add' => ['$avg_voltage_a','$avg_voltage_b' ]