この構造を持つコレクションにユーザー ドキュメントがあります。
{ "_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.5260ms)
この方法で必要な結果が得られます。
ただし、同じ基準に基づいて新しい集計関数と $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.6049ms)
"start_date" と "end_date" は Ruby Date オブジェクトであり、両方のクエリで本質的に同じです。ただし、ログを見ると、さまざまな形式に変更されています。start_date.strftime("%Y-%m-%d") のようなものでフォーマットを強制しようとしても、まだ機能しません。
集約パイプラインには他の関数がありますが、それらを取り出してもエラーが発生します。
集計関数が日付に一致するようにするにはどうすればよいですか?