如果dob为null,则生日查询无效

时间:2014-10-30 14:23:18

标签: ruby-on-rails mongodb

我有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"

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

可能您的聚合失败,因为它无法在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
    }}
])