2017-02-09 2 views
2

Я пытаюсь выполнить запрос MongoDB , содержащий с использованием PHP.MongoDB aggregate with 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 количество секунд с 1 января 1970 года 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

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