2017-02-09 488 views
2

我試圖執行一個MongoDB 聚合使用PHP查詢。MongoDB聚合與PHP

基本上,我得到了波紋管查詢,並將其使用MongoDB的shell時沒有問題,執行:

db.getCollection('frete').aggregate([ 
    {$match : { 
     '$and': [ 
      { 'data_UTC': {$gte: ISODate('2017-01-20T00:00:00-02:00'), $lt: ISODate('2017-01-29T00:00:00-02:00') } }, 
      { 'carga': { $regex : new RegExp('soja', "i") }} 
     ] 
    } 
    }, 
    {$group : {_id: { $dateToString: { format: "%Y-%m-%d", date: { $subtract: ['$data_UTC', 1000 * 60 * 60 * 2] } } }, qtd_acessos: {$sum:1} }}, 
    { $sort: { _id: -1 } }, 
    { $limit: 50} 
]) 

然而,當我試圖通過PHP執行相同的查詢(我composer.json使用"mongodb/mongodb": "^1.0.0"依賴)在調用MongoDB PHP's aggregate()方法後,沒有任何響應返回:

有人可以幫我翻譯上面的查詢到它的PHP等價物嗎?我有以下,但也許我錯過了一些東西:

$start = new \MongoDB\BSON\UTCDateTime(strtotime('2017-01-20T00:00:00-02:00')); 
$end = new \MongoDB\BSON\UTCDateTime(strtotime('2017-01-29T00:00:00-02:00')); 
$regex = new \MongoDB\BSON\Regex('soja', 'i'); 

$filter = [ 
    ['$match' => [ 
      '$and' => [ 
       ['data_UTC' => ['$gte' => $start, '$lt' => $end]], 
       ['carga' => ['$regex' => $regex]] 
      ] 
     ] 
    ], 
    ['$group' => ['_id' => ['$dateToString' => ['format' => "%Y-%m-%d", 'date' => ['$subtract' => ['$data_UTC', 1000 * 60 * 60 * 2]]]], 'qtd_acessos' => ['$sum' => 1]]], 
    ['$sort' => ['_id' => -1]], 
    ['$limit' => 50] 
]; 

謝謝!

回答

0

strtotime返回自1970年1月1日00:00:00以來的秒數。

乘以1000將其轉化爲毫秒。

這應該得到你所需要的。

$start = new \MongoDB\BSON\UTCDateTime(strtotime('2017-01-20T00:00:00-02:00') * 1000); 
$end = new \MongoDB\BSON\UTCDateTime(strtotime('2017-01-29T00:00:00-02:00') * 1000); 

小心日間照明當調整偏移時節省(如果適用)。不要手動做。如果可能的話,用偏移量保存日期。

0

用mongodb標準庫檢查將適用於你。

$pipeline = array(
        array('$match' => 
            array('$and' => 
              array( array('data_UTC' => array('$gte' => new MongoDate(strtotime('2017-01-20T00:00:00-02:00')), $lt: new MongoDate(strtotime('2017-01-20T00:00:00-02:00')))), 
                array('carga' => array($regex => new MongoRegex("/soja$/i"))) 
               ) 
             ) 
         ), 
        array('$group' => array ('_id' => array('$dateToString' => array('format' => "%Y-%m-%d", 'date' => array('$subtract' => array('$data_UTC', 1000 * 60 * 60 * 2)))), 
                'qtd_acessos' => array('$sum' => 1)), 
             array('$sort' => array(_id => -1)), 
             array('$limit' => 50) 
         ) 
       ) 

    $this->mongodb->aggregate($pipeline, 'db_collection_name');