MongoDBの集約フレームワークで使用できる日付集約演算子があります。たとえば、 $dayOfYear
演算子は、グループ化に使用する日付からその値を取得するために使用されます:
db.collection.aggregate([
{ "$group": {
"_id": { "$dayOfYear": "$datetime" },
"total": { "$sum": "$count" }
}}
])
または、代わりに日付計算アプローチを使用できます。エポック日付を適用することにより、日付オブジェクトを数学を適用できる数値に変換します。
db.collection.aggregate([
{ "$group": {
"_id": {
"$subtract": [
{ "$subtract": [ "$datetime", new Date("1970-01-01") ] },
{ "$mod": [
{ "$subtract": [ "$datetime", new Date("1970-01-01") ] },
1000 * 60 * 60 * 24
]}
]
},
"total": { "$sum": "$count" }
}}
])
あなたが求めているのが現在の時点からの間隔である場合、あなたが望むのは基本的に日付計算アプローチであり、 $cond
を介していくつかの条件で動作します 演算子:
db.collection.aggregate([
{ "$match": {
"datetime": {
"$gte": new Date(new Date().valueOf() - ( 1000 * 60 * 60 * 24 * 365 ))
}
}},
{ "$group": {
"_id": null,
"24hours": {
"$sum": {
"$cond": [
{ "$gt": [
{ "$subtract": [ "$datetime", new Date("1970-01-01") ] },
new Date().valueOf() - ( 1000 * 60 * 60 * 24 )
]},
"$count",
0
]
}
},
"30days": {
"$sum": {
"$cond": [
{ "$gt": [
{ "$subtract": [ "$datetime", new Date("1970-01-01") ] },
new Date().valueOf() - ( 1000 * 60 * 60 * 24 * 30 )
]},
"$count",
0
]
}
},
"OneYear": {
"$sum": {
"$cond": [
{ "$gt": [
{ "$subtract": [ "$datetime", new Date("1970-01-01") ] },
new Date().valueOf() - ( 1000 * 60 * 60 * 24 * 365 )
]},
"$count",
0
]
}
}
}}
])
これは基本的にSQLの例と同じアプローチであり、クエリは日付値が必要な範囲内にあるかどうかを条件付きで評価し、値を合計に追加するかどうかを決定します。
ここでの1つの追加は、追加の $match
です。 要求している最大1年の範囲内にある可能性のあるアイテムのみに作用するようにクエリを制限する段階。これにより、インデックスを使用してこれらの値を除外でき、コレクション内の一致しないデータを「ブルートフォース」する必要がないという点で、提示されたSQLよりも少し優れています。
$match
で入力を制限することは常に良い考えです 集約パイプラインを使用する場合。