我正在使用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');
答案 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')
)),
));
});