2017-02-09 15 views
2

私はMongoDB 集約 PHPを使用してクエリを実行しようとしています。PHPでMongoDB集約

は基本的に、私は怒鳴るクエリを持って、MongoDBのシェルを使用している場合には問題なく実行されます。

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 UTCからの秒数を返します。

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');