2016-06-13 135 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' ]