2012-04-26 46 views
1

使用帶有使用MongoDate初始化的子字段的PHP腳本創建了一個mongo集合。集合中所產生的場是這樣的:PHP和MongoDate查詢

"ts_add" : { 
    "sec" : 1335468966, 
    "usec" : 420000 
}, 

當我建立我的查詢aginst在PHP這個領域,我建立這樣的:

$val = new MongoDate(strtotime($strDate)); // $strDate = '2012-04-25' 
... 
$aryQuery = array(STRING_COL_NAME => array ('$gte' => $val)); 

然後我做一些其他的東西並用find()命令執行查詢。

在PHP構建查詢的結構是這樣的,根據調試器:

find(Array 
(
    [ts_add] => Array 
     (
      [$gte] => MongoDate Object 
       (
        [sec] => 1335337200 
        [usec] => 0 
       ) 

     ) 
) 

在我的日誌文件,我看到:

runQuery called coll.table { ts_add: { $gte: new Date(1335337200000) } } 

但沒有數據被不斷返回.. ..我有點羨慕所有額外的零,但我認爲這是默認的時間戳數據添加或一些奇怪的MongoDate - ism ...

如果我手動,從cli,運行此命令:

> db.table.find({ "ts_add.sec": { $gte:1335337200 } }) 

返回完整的數據集(與預期的一樣)。

想這一點,那麼,從CLI,試圖模仿MongoDate件事:

> var start = new Date(2012, 3, 10) 
> db.addons_add.find({ ts_add : { $gte : start } }) 

無數據返回。

如果我使用相同的輸入數據並將其轉換爲MongoID,在$ _id字段中搜索,則搜索成功。

有什麼建議嗎?我錯過了什麼?有感覺我站在距離樹三英寸的地方抱怨我怎麼沒有看到森林...

謝謝!

回答

2

mongod以JavaScript格式打印所有內容,以毫秒爲單位打印日期(這是所有額外0都來自的地方)。因此查詢1335337200正確地變成1335337200 * 1000 = 1335337200000.

雖然您粘貼的初始文檔片段看起來不正確。 "ts_add" : {"sec" : 1335468966, "usec" : 420000}是JSON,但日期類型不應該像JavaScript中那樣。你如何保存日期?它看起來像被轉換爲​​另一種類型的對象,然後存儲爲「通用對象」而不是「日期類型」。

+0

因此,讓我想到 - 你完全有權質疑第一個數據結構。在我的測試版本中,我通過將測試數據設置爲一個沒有參數的新MongoDate()對象來初始化測試數據。 但是,後來在代碼中,我將結構傳遞給驗證例程,以確保插入請求僅添加類的字段列表中列出的列。在插入到mongo之前,ary1到ary2的後續副本將結構從MongoDate()重新輸入到array()。 非常棒,非常感謝你的幫助! – 2012-04-27 00:02:43