2016-12-02 3 views
0

Хотите получить максимальное значение поля speed и соответствующие ему поля для этой записи.Symfony2 Mongodb aggregate - получить максимальное значение для поля

У этого MongoDB запрос:

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' }   
    }   
}); 

Теперь, так как я использую Symfony2 и Монго-ОДМ-агрегации-сверток, хотят получить этот запрос выполняется:

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); 
} 

Это выполняет его, но печатает только _id. Как я могу построить свой запрос MondoDB сверху в Symfony2 mongo-odm-aggregation-bundle (https://packagist.org/packages/solution/mongo-odm-aggregation-bundle) и получить последнюю строку? Это должно быть самое высокое значение speed, поэтому самый быстрый астероид.

Спасибо.

ответ

0

Это делает это:

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); 
    }