2010-10-31 113 views
2

在MongoDB數據庫中,我有一個項目集合,每個項目存儲它的創建日期。我需要按日期查詢這個集合。我想:MongoDB:按日期查詢

db.items.findOne({date:{new Date(1285947037*1000)}})

但它不返回任何東西。我使用PHP獲得了該時間戳($date->sec,其中$date是來自數據庫的MongoDate對象)。那麼做到這一點的正確方法是什麼?謝謝。

+0

你如何在你的收藏中存儲日期?是_they_ unix時間戳,還是將它們存儲爲Date對象? – 2010-10-31 15:00:36

+0

它們存儲爲Date對象。 – pt2ph8 2010-10-31 17:25:48

回答

6

Date構造預計毫秒時間戳。該1285947037時間戳是,這就是爲什麼你被1000

乘以我的猜測是,文件中實際的時間戳包含毫秒,例如1285947037461(注意最後的461)。您將秒數乘以1000,結果爲1285947037000。正如你所看到的,這些時間戳是不相等的:

1285947037461 // actual timestamp in MongoDB 
1285947037000 // value you calculated 

的問題在於MongoDate類:它失去了毫秒的精度,因爲你可以在閱讀documentation。這裏的報價:

這意味着當文檔發送到數據庫/從數據庫發送文檔時,超過毫秒的任何精度將會丟失。

要找到你正在尋找在幾秒鐘內使用時間戳的文件,你需要的東西是這樣的:

db.foo.findOne(function() { 
    // round the stored date to seconds and compare to timestamp 
    return parseInt(this.date/1000) === 1285947037 
}) 

你可以在控制檯毫秒確切時間戳,然後通過使用myDateObject.getTime()

+0

感謝您的解釋,但我無法將此翻譯成PHP。我必須使用MongoCode嗎?否則,如果我在文檔中以秒爲單位存儲時間戳,並使用它來編寫查詢呢? – pt2ph8 2010-10-31 13:32:44

+0

@Brainfeeder:MongoCode可以工作,但我不確定,因爲我自己不使用PHP。以秒爲單位存儲時間戳可以完全避免這個問題,所以這也是一個選擇。 – 2010-10-31 14:03:05

-1

在查詢中有一個小錯誤;除去周圍new Date(...)大括號,你是好去:

db.items.findOne({date: new Date(1285947037*1000)}) 
+0

對,對不起。我在帖子中寫了這行(沒有複製粘貼),那是一個錯字。 – pt2ph8 2010-10-31 13:17:49