使用PHP驱动程序的MongoDB聚合查询

我有一个工作的MongoDB聚合查询,我可以通过MongoDB shell运行.但是,我正在尝试将其转换为使用官方PHP Mongo驱动程序(http://PHP.net/manual/en/mongocollection.aggregate.PHP).

这是工作原始的MongoDB查询

db.executions.aggregate( [  
   { $project : { day : { $dayOfYear : "$executed" } } },
   { $group : { _id : { day : "$day" }, n : { $sum : 1 } } } , 
   { $sort : { _id : -1 } } , 
   { $limit : 14 }
] )

这是我使用Mongo驱动程序在PHP中的尝试(不工作):

$result = $c->aggregate(array(
    '$project' => array(
        'day' => array('$dayOfYear' => '$executed')
    ),
    '$group' => array(
        '_id' => array('day' => '$day'),
        'n' => array('$sum' => 1)
    ),
    '$sort' => array(
        '_id' => 1
    ),
    '$limit' => 14
));

上面的PHP代码错误是:

{"errmsg":"exception: wrong type for field (pipeline) 3 != 4","code":13111,"ok":0}

有任何想法吗?谢谢.

解决方法:

Javascript中的参数是一个包含4个对象的数组,每个对象都有一个元素,在PHP中它是一个带有4个元素的关联数组(对象).这将代表您的Javascript:

$result = $c->aggregate(array(
    array(
      '$project' => array(
          'day' => array('$dayOfYear' => '$executed')
      ),
    ),
    array(
      '$group' => array(
          '_id' => array('day' => '$day'),
          'n' => array('$sum' => 1)
      ),
    ),
    array(
      '$sort' => array(
          '_id' => 1
      ),
    ),
    array(
      '$limit' => 14
    )
));

此外,如果您至少拥有PHP5.4,则可以使用更简单的数组语法.转换到PHP是微不足道的,你只需用方括号替换花括号,用箭头替换冒号:

$result = $c->aggregate([
  [ '$project' => [ 'day' => ['$dayOfYear' => '$executed']  ]  ],
  [ '$group' => ['_id' => ['day' => '$day'], 'n' => ['$sum' => 1]  ] ],
  [ '$sort' => ['_id' => 1] ],
  [ '$limit' => 14 ]
]);

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...