【问题标题】:Birthday query not working if dob is null如果 dob 为空,则生日查询不起作用
【发布时间】:2014-10-30 14:23:17
【问题描述】:

我的用户模型的 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"

有什么建议吗?

【问题讨论】:

  • 什么是“不工作”?没有结果或错误?
  • @ChristianStrempfer,我用错误更新了问题

标签: ruby-on-rails mongodb


【解决方案1】:

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

【讨论】:

  • 是的,但是如果我的所有用户都使用 dob,我的原始代码可以正常工作,而您的代码即使在这种情况下也无法正常工作。我认为 $ifNull 应该可以工作,但可能是我们使用不正确。
  • @Alpesh:抱歉,我现在无法测试它。我会尽快修复它。
  • 谢谢,我也在做这个,如果我修复它会更新
  • @Alpesh:我不知道为什么ifNull 不适用于嵌套文档,但我在一开始就使用了另一个match 步骤。
  • @Alpesh:这对你有帮助吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-15
  • 1970-01-01
相关资源
最近更新 更多