2015-10-06 124 views
0

我有以下聚合:

$pipeline = array(
    array('$match' => array(
     'matchDate' => array(
      '$lte' => $dateEnd, // DateTime object 
      '$gte' => $dateStart // DateTime object 
     ) 
    )), 
    array('$group' => array(
     '_id' => '$sport', 
     'count' => array('$sum' => 1) 
    )) 
); 

$m = new \MongoClient('localhost'); 
$c = $m->selectDB('test_database')->selectCollection('Match'); 
$t = $c->aggregate($pipeline); 

這種聚合將返回一個空的結果。

如果我直接在MongoDB上運行聚合,它可以毫無問題地工作,並且可以得到預期的結果。 這是本機查詢。

db.Match.runCommand({ 
    "aggregate": "Match", 
    "pipeline": [ 
    { 
     "$match": { 
     "matchDate": { 
      "$lte": new ISODate("2015-10-07T23:59:59+02:00"), 
      "$gte": new ISODate("2015-10-06T00:00:00+02:00") 
     } 
     } 
    }, 
    { 
     "$group": { "_id": "$sport", "count": { "$sum": 1 } } 
    } 
]}); 

該問題僅出現在聚合中。用日期查找查詢($ lte,$ gte)也沒有問題。

這是一個示例文檔。

{ 
    "_id": ObjectId("5613bbb79042ad801f0041ab"), 
    "sport": ObjectId("5613bbb79042ad801f0041a8"), 
    "matchDate": new Date("2015-09-26T13:45:00+0200") 
} 

有人知道這裏發生了什麼?

我使用

MongoDB的支持1.6.11

PHP 5.6.13

的MongoDB 3.0.6

+0

你構建日期將是無效的。如果問題仍然存在,請檢查您的日期輸入並在代碼中顯示代碼。 –

+0

我的輸入是一個DateTime對象。什麼纔是正確的輸入? – createproblem

+1

[MongoDate](http://php.net/manual/en/class.mongodate.php) –

回答

0

它會與MongoDate工作。

$pipeline = array(
    array('$match' => array(
     'matchDate' => array(
      '$lte' => new MongoDate($dateEnd->getTimestamp()), 
      '$gte' => new MongoDate($dateStart->getTimestamp()) 
     ) 
    )), 
    array('$group' => array(
     '_id' => '$sport', 
     'count' => array('$sum' => 1) 
    )) 
); 

$m = new \MongoClient('localhost'); 
$c = $m->selectDB('test_database')->selectCollection('Match'); 
$t = $c->aggregate($pipeline); 

感謝@Blakes七