6

我有称为更改的 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 的解决方案,而不是其他可能的解决方案:)。

4

2 回答 2

11

您最好使用聚合框架方法,并深入研究底层驱动程序提供的原始 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 方式以获得最佳性能。

于 2014-06-10T14:12:20.830 回答
0

即使这是一个问题,存储库 wiki 中有一个不安全的条目:复杂聚合调用

希望它可以帮助像我这样的其他人;)

于 2020-09-09T15:44:32.610 回答