2016-12-02 1 views
0

Sie möchten den Maximalwert des Felds speed und die entsprechenden anderen Felder für diesen Datensatz ermitteln.Symfony2 Mongodb-Aggregat - Maximalwert für ein Feld erhalten

Lassen Sie sich diese MongoDB Abfrage:

db.Neo.aggregate({ 
    $group: { 
     _id: '$name', 
     date: { $first: '$date' }, 
     neo_reference_id: { $first: '$neo_reference_id' }, 
     name: { $first: '$name' }, 
     speed: { 
      $max: "$speed" 
     }, 
     is_potentially_hazardous_asteroid: { $first: '$is_potentially_hazardous_asteroid' }   
    }   
}); 

Jetzt, da ich Symfony2 und Mongo-odm-Aggregation-Bündel verwende, möchte diese Abfrage ausgeführt werden:

public function neofastestAction() { 

    $expr = new \Solution\MongoAggregation\Pipeline\Operators\Expr; 
    $aq = $this->get('doctrine_mongodb.odm.default_aggregation_query')->getCollection('NeoNasaBundle:Neo')->createAggregateQuery(); 

    $result = $aq->group(['_id'=>'$name' ]) 
     ->getQuery()->aggregate()->toArray();   
    $serializer = $this->get('jms_serializer'); 
    $response = $serializer->serialize($result,'json'); 
    return new Response($response); 
} 

Dies führt ihn aus, aber druckt nur die _id. Wie baue ich meine MondoDB-Abfrage von oben in Symfony2 mongo-odm-aggregation-bundle (https://packagist.org/packages/solution/mongo-odm-aggregation-bundle) und bekomme die letzte Zeile? Es sollte der höchste Wert von speed sein, also der schnellste Asteroid.

Danke.

Antwort

0

Dies tut es:

public function neofastestAction() { 

     $expr = new \Solution\MongoAggregation\Pipeline\Operators\Expr; 
     $aq = $this->get('doctrine_mongodb.odm.default_aggregation_query')->getCollection('NeoNasaBundle:Neo')->createAggregateQuery(); 

     $result = $aq->group(['_id'=>'$name', 'date'=> $expr->first('$date'), 'neo_reference_id'=> $expr->first('$neo_reference_id'), 'name'=> $expr->first('$name'), 'speed'=> $expr->max('$speed'),'is_potentially_hazardous_asteroid'=> $expr->first('$is_potentially_hazardous_asteroid') ]) 
      ->sort(['speed' => -1])->limit(1)->getQuery()->aggregate()->toArray(); 


     $serializer = $this->get('jms_serializer'); 
     $response = $serializer->serialize($result,'json'); 

     return new Response($response); 
    } 
Verwandte Themen