我有名为更改的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"
}
然后我想制作典型的SQL查询来计算事件并按field
对其进行分组。所以,我在MongoDB中创建了查询
db.changes.group({
"key": {
"field": true
},
"initial": {
"count": 0,
},
"reduce": function(obj, prev) {
prev.count++;
},
});
它运行正常,但如何将其转换为与Laravel 4一起使用?我正在使用jenssegers / laravel-mongodb与mongo服务器进行通信。
此外,我在查询中有更多条件,我已将其删除以使我的问题看起来更清晰,所以我正在寻找将该查询完全转换为laravel的解决方案,而不是其他可能的解决方案:)。
答案 0 :(得分:8)
您最好使用聚合框架方法,也可以深入了解底层驱动程序提供的原始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
)
)
)
));
});
结果与.group()
之类的方法的结果略有不同,但是它使用MongoDB服务器上的本机代码,并且不依赖于.group()
方法实际上做的JavaScript解释,实际上是mapReduce的包装器。
最终结果要快得多,并且通常比从本机框架界面中获得的效率更高。
因此,请使用本机MongoDB方式获得最佳性能。
答案 1 :(得分:0)
即使是一个问题,存储库Wiki中也有一个无用的条目:Complex aggregate call
希望它可以对像我这样的人有所帮助;)