【问题标题】:How to convert MongoDB aggregation query to Laravel MongoDB by jenssegersjenssegers 如何将 MongoDB 聚合查询转换为 Laravel MongoDB
【发布时间】:2014-07-31 07:55:56
【问题描述】:

我有一个名为 changes 的 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 的解决方案,而不是其他可能的解决方案:)。

【问题讨论】:

    标签: php mongodb laravel aggregation-framework jenssegers-mongodb


    【解决方案1】:

    即使是一个问题,存储库 wiki 中也有一个不安全的条目:Complex aggregate call

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 好的,效果很好,但可能有一个缺点。我需要在某个时间段内(上周和上个月内)计算所有内容。我不想运行 2 个查询,但我可以做一个。我附上了我的原始查询。如何在您的示例中运行自定义 reduce 函数?
      • @estshy 以你的方式改变你的问题确实不是一个好主意。对于那些过来发现提供的答案与您所要求的不匹配的人来说,这是非常具有误导性的。如果您发布另一个问题,我将与其他人一样乐意回答。这里的一般情况是一问一答。我可以回答您的附加问题,但应该完全是另一个问题。请单独发布。
      猜你喜欢
      • 2018-08-28
      • 2015-10-09
      • 1970-01-01
      • 1970-01-01
      • 2018-01-08
      • 1970-01-01
      • 1970-01-01
      • 2021-09-03
      • 2019-06-18
      相关资源
      最近更新 更多