mongoDb中的多级总和

时间:2015-05-15 10:32:42

标签: mongodb laravel-4

我正在使用jenssegers与Laravel合作开发mongoDB。我试图根据time.estimated_time_in_number求和。

我有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');

1 个答案:

答案 0 :(得分: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聚合框架,并且速度更快,并且通常比从本机框架接口中获得的效率更高:

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

- 更新 -

您可以为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')
           )),
      ));
 });