私は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の値は文字列です。これはまったく意味がありません。