Mat*_*wak 5 php mongodb laravel aggregation-framework jenssegers-mongodb
我有一个称为更改的 MongoDB集合,其中包含以下数据
{
"date" : ISODate("2014-06-09T00:00:00.000Z"),
"field" : "ip",
"from" : "157.11.209.123",
"to" : "107.21.109.254"
}
{
"date" : ISODate("2014-05-15T00:00:00.000Z"),
"field" : "ip",
"from" : "107.21.109.254",
"to" : "157.11.209.123"
}
{
"date" : ISODate("2014-06-09T00:00:00.000Z"),
"field" : "registration",
"from" : "Old service",
"to" : "Some new service"
}
Run Code Online (Sandbox Code Playgroud)
然后我想制作典型的SQL查询来计算出现次数并将其分组field.所以,我在MongoDB中创建了查询
db.changes.group({
"key": {
"field": true
},
"initial": {
"count": 0,
},
"reduce": function(obj, prev) {
prev.count++;
},
});
Run Code Online (Sandbox Code Playgroud)
它工作正常,但我如何将其转换为与Laravel 4一起使用?我正在使用jenssegers/laravel-mongodb与mongo服务器进行通信.
另外,我在查询中有更多条件,我已删除它以使我的问题看起来更清楚,所以我正在寻找将该查询完全转换为laravel的解决方案,而不是其他可能的解决方案:).
您最好使用聚合框架方法,也可以深入了解底层驱动程序提供的原始MongoDB集合对象.尝试翻译语法是一个更好的选择:
// Returns the original Mongo Result
$result = DB::collection('changes')->raw(function($collection)
{
return $collection->aggregate(array(
array(
'$group' => array(
'_id' => '$field',
'count' => array(
'$sum' => 1
)
)
)
));
});
Run Code Online (Sandbox Code Playgroud)
结果与类似方法的结果略有不同,.group()但是它使用MongoDB服务器上的本机代码,并且不像.group()方法实际那样依赖JavaScript解释,实际上是mapReduce的包装器.
最终结果要快得多,并且通常比从本机框架界面中获得的效率更高.
因此,使用本机MongoDB方式可获得最佳性能.