2014-02-28 76 views
0

我正在使用Rails v4和MongoDB。我有一列'dob日期類型,我想查找即將到來的生日嗎?請幫忙。使用rails查詢即將到來的生日嗎?

我試圖像下面,但沒有用:

scope :upcoming_birthdays, -> 
     { 
     where({"dob.strftime('%m').lte" => 
       (Date.today+3.days).month, 
       "dob.strftime('%d').lte" =>(Date.today+3.days).day}) 
     } 
+0

你會得到什麼樣的錯誤?你在mongoid嗎? – xlembouras

+1

難道你不能只通過一系列的生日嗎?數據庫中存儲的生日是什麼格式?在邏輯上:'生日> =今天和生日 WiredPrairie

+0

**其他點**是你使用你的語言**本地日期對象**不是字符串。如果您的文檔字段中有字符串,則應將其更改爲日期。 –

回答

0

在蒙戈,你可以用你想要的實際$match標準使用聚合框架,該框架

db.collection.aggregate([ 
    {$project: {_id: 1, month: {$month: '$dob'}, day: {$dayOfMonth: '$dob'}}}, 
    {$match: {month: 9, day: 14}} ]) 

所以,你應該抽出你的範圍去做,或者實現一個類方法而不是範圍。

+0

問題要求**日期範圍**,這是不行的。而且這種匹配只在你絕對需要的地方有用。一旦你有**預測**你的指標不能再通過其餘的管道使用。這就是爲什麼你會與本地日期範圍**第一**匹配。 –

0

最後我得到了解決方案,但它必須重新考慮因素。在這裏我得到今天和未來兩天生日用戶的詳細信息。

pro = {:day => {:$dayOfMonth => '$dob'}, :month => {:$month => '$dob'}, :year => {:$year => '$dob'} } 
today = Date.today 
birth_dates = [today.day, (today+1.day).day, (today+2.days).day ] 
birth_months = [today.month, (today+1.day).month, (today+2.days).month ].uniq 
mat = {day: { '$in' => birth_dates } , month: { '$in' => birth_months } } 
uids = User.collection.aggregate([{:$project => pro }, {:$match => mat }]).map{ |h| h["_id"] } 
birth_users = User.find(uids, :order => :dob) 

但問題是,在這裏出生日期字段是可選的,所以它導致以下錯誤

失敗,出現錯誤16006:異常:無法從BSON類型EOO轉換爲Date

任何一個建議請。

謝謝, Prasad

+0

得到答案=> User.collection.aggregate([{:$ match => {:dob => {:$ exists => true}}},{:$ project => pro}]) –