2015-05-15 4 views
1

Я работаю над mongoDB с Laravel, используя jenssegers. И я пытаюсь суммировать на основе time.estimated_time_in_number.Многоуровневая сумма в mongoDb

У меня есть документ MongoDB, который содержит следующие данные.

"time": [ 
    { 
     "id": "QZMV154213", 
     "estimated_time_in_number": 4.41 
    }, 
    { 
     "id": "QZMV154213", 
     "estimated_time_in_number": 2.25 
    },{ 
     "id": "QZMV154213", 
     "estimated_time_in_number": 5 
    } 
    ] 

Я использую следующий запрос, и он дает мне 0, а не 11.66.

Task::sum('time.estimated_time_in_number'); 

ответ

2

Вы можете использовать aggregation framework, чтобы получить сумму, и трубопровод агрегация, что дает вам, что результат будет что-то вроде этого:

db.task.aggregate([ 
    { 
     "$unwind": "$time" 
    }, 
    { 
     "$group": { 
      "_id": 0, 
      "total_estimated_time": { 
       "$sum": "$time.estimated_time_in_number" 
      } 
     } 
    } 
]) 

, который даст вам выходного

/* 0 */ 
{ 
    "result" : [ 
     { 
      "_id" : 0, 
      "total_estimated_time" : 11.66 
     } 
    ], 
    "ok" : 1 
} 

Чтобы реализовать это в laravel, используйте необработанный запрос следующим образом, который использует базовую структуру агрегации MongoDB a Бова и гораздо быстрее, а также в целом более эффективен, чем вы получите из нативного рамочного интерфейса:

Task::raw(function($collection){ 
       return $collection->aggregate(array(
        array('$unwind' => '$time'),     
        array('$group' => array(
         "_id" => 0, 
         "total_estimated_time" => array('$sum' => '$time.estimated_time_in_number') 
        )), 
       )); 
      }); 

- UPDATE -

Вы можете назначить переменные результат из запроса агрегации MongoDB следующим образом:

$result = DB::collection('tasks')->raw(function($collection) 
{ 
    return $collection->aggregate(array(
      array('$unwind' => '$time'),     
      array('$group' => array(
       "_id" => 0, 
       "total_estimated_time" => array('$sum' => '$time.estimated_time_in_number') 
      )), 
    )); 
}); 
+0

Я понятия не имею, как написать необработанный запрос mongoDB. Так вы можете сказать мне, как добавить, где условие выше необработанный запрос. –

+0

@GaurangGhinaiya Реализация прямо там, в ответе, присваивает оператор переменной. – chridam

Смежные вопросы