2 つのコレクションを結合し、外部テーブルの日付フィールドを並べ替えてから、フィールドをグループ化して、以下のように各デバイスの最近の日付から 1 つのレコードのみを取得したいと考えています。
$collection = $this->db->dv_device;
$result_data = $collection->aggregate(
array('$lookup'=>array('from'=>'dv_device_readings', 'localField'=>'device_id', 'foreignField'=>'device_id','as'=>'result_data')),
array('$match'=>array('user_id'=>'5809c169622d10a419000029')),
array('$sort'=>array('result_data.date_time'=>-1)),
array('$group' => array(
"_id" => array("device_id" => '$result_data.device_id'),
"device_id" => array('$first' => '$result_data.device_id'),
"date_time" => array('$first' => '$result_data.date_time'),
"dc_voltage" => array('$first' => '$result_data.dc_voltage'),
"dc_current" => array('$first' => '$result_data.dc_current'),
"output_voltage" => array('$first' => '$result_data.output_voltage'),
"output_current" => array('$first' => '$result_data.output_current'),
))
);
上記のコードを php で使用すると、以下の結果が得られました。2 つのコレクションの結合は正常に機能していますが、並べ替えとグループ化は機能していません。
Array
(
[waitedMS] => 0
[result] => Array
(
[0] => Array
(
[_id] => Array
(
[device_id] => Array
(
[0] => dv1002
[1] => dv1002
)
)
[device_id] => Array
(
[0] => dv1002
[1] => dv1002
)
[date_time] => Array
(
[0] => MongoDate Object
(
[sec] => 1477476049
[usec] => 0
)
[1] => MongoDate Object
(
[sec] => 1477476313
[usec] => 0
)
)
[dc_voltage] => Array
(
[0] => dv1
[1] => dvv2
)
[dc_current] => Array
(
[0] => dc1
[1] => dc2
)
[output_voltage] => Array
(
[0] => output voltage1
[1] => output voltage2
)
[output_current] => Array
(
[0] => output current1
[1] => output current2
)
)
)
[ok] => 1
)
以下のような結果が必要です
Array
(
[waitedMS] => 0
[result] => Array
(
[0] => Array
(
[device_id] => dv1002
[date_time] => MongoDate Object
(
[sec] => 1477476313
[usec] => 0
)
[dc_voltage] => dvv2
[dc_current] => dc2
[output_voltage] => output voltage2
[output_current] => output current2
)
)
[ok] => 1
)