【发布时间】:2012-11-24 23:45:04
【问题描述】:
我在一个集合中有这样的结构的用户文档:
{ "_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 database=db command={: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 database=db command={:aggregate=>"users", :pipeline=>[{"$match"=>{:activities=>{"$elemMatch"=>{ "date_time_created"=>{"$gte"=>2012 年 5 月 10 日星期四,"$lt"=>2012 年 7 月 12 日星期四}}}}}]} (0.6049 毫秒)
“start_date”和“end_date”是 Ruby Date 对象,在两个查询中基本相同。但是,当我查看日志时,它们会变成不同的格式。当我尝试使用 start_date.strftime("%Y-%m-%d") 之类的东西强制格式时,它仍然不起作用。
聚合管道中还有其他函数,但我把它们取出来仍然报错。
如何让聚合函数在日期上匹配?
【问题讨论】:
-
你不需要 $elemMatch 这里 - 你可以删除它,看看这是否会改变正在发生的事情? $elemMatch 用于比较数组元素的两个不同属性时,这里是测试单个值。
标签: ruby-on-rails ruby mongodb aggregation-framework moped