2014-02-28 26 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}]) –