Mongoアグリゲーションフレームワークを使用した新しい回答
この質問に答えた後、10genは集約フレームワークを備えたMongodbバージョン2.2をリリースしました。これは、この種のクエリを実行するためのより良い方法です。日付でグループ化し、保存される値がタイムスタンプであるため、このクエリは少し難しいです。そのため、タイムスタンプを一致する日付に変換するために何かを行う必要があります。例として、適切なカウントを取得するクエリを作成します。
db.col.aggregate(
{ $group: { _id: { $dayOfYear: "$date"},
click: { $sum: 1 } } }
)
これにより、次のような結果が返されます:
[
{
"_id" : 144,
"click" : 165
},
{
"_id" : 275,
"click" : 12
}
]
$match
を使用する必要があります クエリを関心のある日付範囲と$project
に制限します _id
の名前を変更します date
。年の日を日付に戻す方法は、読者の練習問題として残されています。 :-)
10genには、ブックマークする価値のある便利なSQLからMongoAggregationへの変換チャートがあります。日付集計演算子に関する特定の記事もあります。
少し凝ったものにすると、次を使用できます:
db.col.aggregate([
{ $group: {
_id: {
$add: [
{ $dayOfYear: "$date"},
{ $multiply:
[400, {$year: "$date"}]
}
]},
click: { $sum: 1 },
first: {$min: "$date"}
}
},
{ $sort: {_id: -1} },
{ $limit: 15 },
{ $project: { date: "$first", click: 1, _id: 0} }
])
これにより、最新の15日間が取得され、date
で毎日の日時が返されます。 分野。例:
[
{
"click" : 431,
"date" : ISODate("2013-05-11T02:33:45.526Z")
},
{
"click" : 702,
"date" : ISODate("2013-05-08T02:11:00.503Z")
},
...
{
"click" : 814,
"date" : ISODate("2013-04-25T00:41:45.046Z")
}
]