我在具有以下结构的集合中有用户文档:
{ "_id" : ObjectId( "4fb54ef46d93b33b21003951" ),
"activities" : [
{ "id" : ObjectId( "4fd66f9001e7fe9f03000065" ),
"type" : "checkin",
"date_time_created" : Date( 1339453328000 )},
{ "date_time_created" : Date( 1337351732000 ),
"date_time_updated" : Date( 1337351952635 ),
"id" : ObjectId( "4fb65e346d93b3fe77000000" )}
]
}
我可以根据日期轻松查询这些文档:
User.where(
:activities => {
'$elemMatch' => {
:date_time_created => { '$gte' => start_date, '$lt' => end_date }
}
}
).length
根据日志:
MOPED: 127.0.0.1:27017 COMMAND 数据库=db 命令={:count=>"users", :query=>{"activities"=>{"$elemMatch"=>{"date_time_created"=>{"$gte" =>2012-05-10 00:00:00 UTC,“$lt”=>2012-07-12 00:00:00 UTC}}}}}(0.5260 毫秒)
我以这种方式得到了我需要的结果。
但是,当我尝试基于相同的条件使用新的聚合函数和 $match 时:
User.collection.aggregate( [
{ "$match" => {
:activities => {
'$elemMatch' => {
:date_time_created => { '$gte' => start_date, '$lt' => end_date }
}
}
} }
]).length
根据日志:
MOPED: 127.0.0.1:27017 COMMAND 数据库=db command={:aggregate=>"users", :pipeline=>[{"$match"=>{:activities=>{"$elemMatch"=>{"date_time_created" =>{"$gte"=>2012 年 5 月 10 日,星期四,"$lt"=>2012 年 7 月 12 日,星期四}}}}}]} (0.6049ms)
“start_date”和“end_date”是 Ruby Date 对象,在两个查询中基本相同。但是,当我查看日志时,它们会变成不同的格式。当我尝试使用 start_date.strftime("%Y-%m-%d") 之类的东西强制格式时,它仍然不起作用。
聚合管道中还有其他功能,但我把它们拿出来,我仍然得到错误。
如何让聚合函数在日期上匹配?