我有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 :(得分: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
}}
])