2011-05-06 219 views
14

我似乎無法找到任何使用Mongoid/Rails進行日期範圍查詢的任何內容。以下是我嘗試過的一些查詢(約100人之中)。如果它返回任何東西,它總是忽略'end_date'。兩個日期都是日期時間...Mongoid日期範圍查詢

all(:conditions => {:created_at => start_date.to_datetime..end_date.to_datetime}) 

結果:

NoMethodError: undefined method `to_i' for Tue, 26 Apr 2011 00:00:00 +0000..Fri, 06 May 2011 00:00:00 +0000:Range 

另一個例子......

where(:created_at => {'$gte' => start_date,'$lt' => end_date}) 

導致一個成功的查詢,但結束日期將被忽略。結果在開始日期後正確返回,但不受結束日期的限制。

我一直在解決這個問題好幾天無濟於事。在網上,在論壇或IRC上幫助不大。

很想弄清楚我在做什麼錯:)

回答

11
+1

確實在Mongoid 2.0.2中已經修復了這個問題,但是我找不到任何有關這個bug修復的文檔......這有點令人擔心,這些bug可能會對我的應用程序產生重大影響......不知道該怎麼辦以防止這樣的問題,如果它在未來的版本中再次破壞:( – Alex 2011-06-26 14:00:46

+1

而且它似乎再次打破。在這裏的Mongoid 3.0,同樣的問題。 – Michael 2013-02-09 09:40:56

0

我使用MongoDB的shell來測試:

執行該幾次

db.con.save({創建新的日期()})

然後我

> db.con.find() 
{ "_id" : ObjectId("4dc3d380724a42d80d636b09"), "created" : ISODate("2011-05-06T10:54:56.809Z") } 
{ "_id" : ObjectId("4dc3d383724a42d80d636b0a"), "created" : ISODate("2011-05-06T10:54:59.699Z") } 
{ "_id" : ObjectId("4dc3d385724a42d80d636b0b"), "created" : ISODate("2011-05-06T10:55:01.543Z") } 
{ "_id" : ObjectId("4dc3d38b724a42d80d636b0c"), "created" : ISODate("2011-05-06T10:55:07.043Z") } 
{ "_id" : ObjectId("4dc3d38c724a42d80d636b0d"), "created" : ISODate("2011-05-06T10:55:08.168Z") } 
{ "_id" : ObjectId("4dc3d49d4087861731076f8a"), "created" : ISODate("2011-05-06T10:59:41.755Z") } 

作爲分割日期我選擇ISODate("2011-05-06T10:55:00Z")使用d = new Date(2011,04,06,12,55,00)創建此差異從月份開始於零開始,時間爲utc時區。 現在db.con.find({"created": {$gt:d}})產生

{ "_id" : ObjectId("4dc3d385724a42d80d636b0b"), "created" : ISODate("2011-05-06T10:55:01.543Z") } 
{ "_id" : ObjectId("4dc3d38b724a42d80d636b0c"), "created" : ISODate("2011-05-06T10:55:07.043Z") } 
{ "_id" : ObjectId("4dc3d38c724a42d80d636b0d"), "created" : ISODate("2011-05-06T10:55:08.168Z") } 
{ "_id" : ObjectId("4dc3d49d4087861731076f8a"), "created" : ISODate("2011-05-06T10:59:41.755Z") } 

所以MongoDB的做的一切是正確的。如何在Ruby中做到這一點是我不知道的。

+1

感謝您的幫助。我發現了一個有效的Mongoid補丁。 – 2011-05-07 14:39:04

2

我做了一些研究和跨崗位Advanced Queries,在其中一個用戶請求傳來:

有沒有更好的方式來進行排序或查詢 使用日期時間的比較,比 存儲蒙戈的日期一個 自紀元以來的整數秒?這 是目前唯一的方式,是 工作我做Mongo比較 檢索結果。

其他用戶的回覆是:

使用本地BSON日期類型。 從內部看,這是一個64位整數 自 開始的毫秒數。

因此,您可能想要採用不同的方法,並在範圍查詢的時間之間的毫秒數之間進行轉換。這樣你就可以在整數上做一個簡單的gte/lt。用戶的建議是比較新的(3個月前發佈),所以它可能仍然是比較日期與一般Mongo(以及Mongoid)的最簡單方法。

+0

感謝您的幫助。我發現了一個有效的Mongoid補丁。 – 2011-05-07 14:38:52