如何通过jenssegers将MongoDB聚合查询转换为Laravel MongoDB

时间:2014-06-10 13:57:25

标签: 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"
}

然后我想制作典型的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的解决方案,而不是其他可能的解决方案:)。

2 个答案:

答案 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

希望它可以对像我这样的人有所帮助;)