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的值是字符串。這完全沒有意義。