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

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的解决方案,而不是其他可能的解决方案:).

Nei*_*unn 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
                )
            )
        )   
    ));
});
Run Code Online (Sandbox Code Playgroud)

结果与类似方法的结果略有不同,.group()但是它使用MongoDB服务器上的本机代码,并且不像.group()方法实际那样依赖JavaScript解释,实际上是mapReduce的包装器.

最终结果要快得多,并且通常比从本机框架界面中获得的效率更高.

因此,使用本机MongoDB方式可获得最佳性能.

  • @estshy以你的方式改变你的问题真的不是一个好主意.对于那些过来并且看到所提供的答案与您提出的答案不符的人来说,这是非常误导的.如果你发布另一个问题,我会像其他人一样乐意回答.这里的一般情况是一个问题一个答案.我可以回答你的其他问题但完全应该是另一个问题.请单独发布. (2认同)