在MongoDB數據庫中,我有一個項目集合,每個項目存儲它的創建日期。我需要按日期查詢這個集合。我想:MongoDB:按日期查詢
db.items.findOne({date:{new Date(1285947037*1000)}})
但它不返回任何東西。我使用PHP獲得了該時間戳($date->sec
,其中$date
是來自數據庫的MongoDate
對象)。那麼做到這一點的正確方法是什麼?謝謝。
在MongoDB數據庫中,我有一個項目集合,每個項目存儲它的創建日期。我需要按日期查詢這個集合。我想:MongoDB:按日期查詢
db.items.findOne({date:{new Date(1285947037*1000)}})
但它不返回任何東西。我使用PHP獲得了該時間戳($date->sec
,其中$date
是來自數據庫的MongoDate
對象)。那麼做到這一點的正確方法是什麼?謝謝。
的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()
。
感謝您的解釋,但我無法將此翻譯成PHP。我必須使用MongoCode嗎?否則,如果我在文檔中以秒爲單位存儲時間戳,並使用它來編寫查詢呢? – pt2ph8 2010-10-31 13:32:44
@Brainfeeder:MongoCode可以工作,但我不確定,因爲我自己不使用PHP。以秒爲單位存儲時間戳可以完全避免這個問題,所以這也是一個選擇。 – 2010-10-31 14:03:05
在查詢中有一個小錯誤;除去周圍new Date(...)
大括號,你是好去:
db.items.findOne({date: new Date(1285947037*1000)})
對,對不起。我在帖子中寫了這行(沒有複製粘貼),那是一個錯字。 – pt2ph8 2010-10-31 13:17:49
你如何在你的收藏中存儲日期?是_they_ unix時間戳,還是將它們存儲爲Date對象? – 2010-10-31 15:00:36
它們存儲爲Date對象。 – pt2ph8 2010-10-31 17:25:48