2016-10-26 5 views
3

Je veux joindre deux collections et trier le champ de date dans la table étrangère et ensuite regrouper les champs pour obtenir un seul enregistrement de la date récente pour chaque appareil comme ci-dessouscomment trier résultat de recherche dans MongoDB

$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'), 
     )) 
     ); 

En utilisant le code ci-dessus en php, j'ai obtenu le résultat ci-dessous, joindre deux collections fonctionne bien, mais le tri et le regroupement ne fonctionne pas.

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 
) 

J'ai besoin le résultat ci-dessous

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 
) 

Répondre

1

Vous devrez peut-être un $unwind, de sorte que vous pouvez effectuer un regroupement sur regardé la collection. Ajouter cette ligne après $match.

array('$unwind'=>'$result_data') 
+0

J'ai obtenu le résultat exactement ce que je cherche merci. – vignesh