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的值是字符串。这完全没有意义。