質問

日付フィールドを含むコレクションを持っています。私はそれを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 }
            }
    }
])
.

あなたの日付を返します。 これはあなたを助けます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top