MongoDBでのグループビーの日帰り戦にプロジェクト完了日
-
20-12-2019 - |
質問
日付フィールドを含むコレクションを持っています。私はそれをDayOfMonthによってグループ化したいが、予測時に私は完全な日付と関連するカウントを投影したい。
MongoDBには、タイムスタンプを含む生のコレクションがあります(日付フィールド) これは私の集約クエリです:
db.raw.aggregate(
{
"$match" : { "Timestamp":{$gte:new Date("2012-05-30T00:00:00.000Z"),$lt:new Date("2014-05-31T00:00:00.000Z")}}
},
{
$group:
{
_id: { ApplicationId: "$ApplicationId", date: {$dayOfMonth: '$Timestamp'} },
count: { $sum: 1 }
}
}
)
.
上記のクエリでは、DayOfMonthとグループ化していますが、どのようにプロジェクトをプロジェクトするには、数日を完了できますか?
解決
あなたの「タイムスタンプ」の値は明らかに時間的に実際の時点ですので、実際には「完全な日付」ではありません。あなたが適用している日付範囲に基づいて、一般的に「数学を実行する」と結果が返された結果を処理したときに返された値を返しました。
代わりに、「TimesTamp」の値を日に丸めることで、日付の値に「数学を適用する」と「数学を適用することもできます。返された値はデイトオブジェクトではなくなりますが、エポック値以降のミリ秒です。そのため、デート機能を持つ「シード」を比較的簡単です。
db.raw.aggregate([
{ "$match" : {
"Timestamp":{
"$gte": new Date("2012-05-30"),
"$lt": new Date("2014-05-31")
}
}},
{ "$group": {
"_id": {
"$subtract": [
{ "$subtract": [ "$Timestamp", new Date("1970-01-01") ] },
{ "$mod": [
{ "$subtract": [ "$Timestamp", new Date("1970-01-01") ] },
1000 * 60 * 60 * 24
])
]
},
"count": { "$sum": 1 }
}}
])
.
SO
他の違いから1つの日付オブジェクトを差し引いた場合、ミリ秒は数として返されます。だからこれは、エポックの日付を差し引くことによってepoch秒に対して正規化されています。残りは現在の日に結果を丸めるための基本日数です。
もう一度他の日付集約演算子と文字列に連結するだけで、通常は直接使用のためのものであった場合は、通常もう少し作業が行われます。
db.raw.aggregate([
{ "$match" : {
"Timestamp":{
"$gte": new Date("2012-05-30"),
"$lt": new Date("2014-05-31")
}
}},
{ "$group": {
"_id": {
"$concat": [
{ "$substr": [{ "$year": "$Timestamp" },0,4] },
"-",
{ "$substr": [{ "$month": "$Timestamp" },0,2] },
"-",
{ "$substr": [{ "$dayOfMonth": "$Timestamp" },0,2] }
]
},
"count": { "$sum": 1 }
}}
])
. 他のヒント
ニール・ルーンは素晴らしい答えを提供しています。 uを使用できるのは、より1つのアプローチ:
db.raw.aggregate([
{
"$match" :
{
"Timestamp":{"$gte": new Date("2012-05-30"), "$lt": new Date("2014-07-31")}
}
},
{
"$group" :
{
"_id":{"$dayOfMonth": "$Timestamp"},
"Date":{"$first":"$Timestamp"},
"count": { "$sum": 1 }
}
}
])
.
あなたの日付を返します。 これはあなたを助けます。
所属していません StackOverflow