2014-10-30 47 views
1

我有DOB用户模型作为波纹管生日查询不工作,如果DOB是空

field :dob, :type => Date 

我想找到用户的生日是今天。我试过

User.collection.aggregate([ 
    { "$project" => { 
     "dob" => { 
      "day" => { "$dayOfMonth" => "$dob" }, 
      "month" => { "$month" => "$dob" } 
     } 

    }}, 
    { "$match" => { 
     "dob.day" => Time.now.day, 
     "dob.month" => Time.now.month 
    }} 
    ]) 

它只在所有用户都有dob时才起作用。如果任何一个用户有dob = null,则它不起作用。

收到此错误

Moped::Errors::OperationFailure: The operation: #<Moped::Protocol::Command 
     @length=249 
     @request_id=2 
     @response_to=0 
     @op_code=2004 
     @flags=[:slave_ok] 
     @full_collection_name="api_development.$cmd" 
     @skip=0 
     @limit=-1 
     @selector={:aggregate=>"users", :pipeline=>[{"$project"=>{"dob"=>{"day"=>{"$dayOfMonth"=>"$dob"}, "month"=>{"$month"=>"$dob"}}}}, {"$match"=>{"dob"=>{"$ne"=>nil}, "dob.day"=>30, "dob.month"=>10}}]} 
     @fields=nil> 
    failed with error 16006: "exception: can't convert from BSON type NULL to Date" 

有什么建议?

+0

什么意思是“不工作”?没有结果或错误? – 2014-10-30 16:06:20

+0

@ChristianStrempfer,我更新了错误 – Alpesh 2014-10-30 16:11:40

回答

0

可能是您的聚合失败,因为它不能将NULL日期函数应用于NULL,因此您必须删除dob等于NULL的文档。

User.collection.aggregate([ 
    { "$match" => { 
     "dob" => { "$ne" => nil } 
    }}, 
    { "$project" => { 
     "dob" => { 
      "day" => { "$dayOfMonth" => "$dob" }, 
      "month" => { "$month" => "$dob" } 
     } 
    }}, 
    { "$match" => { 
     "dob.day" => Time.now.day, 
     "dob.month" => Time.now.month 
    }} 
]) 
+0

的问题不,这不适用于我 – Alpesh 2014-10-30 17:34:57

+0

@Alpesh:同样的错误? – 2014-10-30 17:36:21

+0

是的,但是如果我拥有使用dob的所有用户,我的原始代码就可以工作,而即使在这种情况下,您的代码也无法正常工作。 我认为$ ifNull应该可以工作,但可能是我们错误地使用它。 – Alpesh 2014-10-30 17:49:33