1

次のようなドキュメントがあります。

{
    "_id" : ObjectId("57dffd3b65291f06dab34385"),
    "user" : "12345667890"
    "time" : NumberLong(1474297140186)
}

特定のアプリケーションの訪問者数をカウントしようとしています。64 個のフィールドがあり、クエリは次のようになります。

db.convo_log.aggregate([
   {
       '$group': {
            '_id': { 
                month: { $month: new Date("$time") }, 
                day: { $dayOfMonth: new Date("$time") }, 
                year: { $year: new Date("$time") } 
            }, 
            'count': { '$sum': 1 }
       }
   }
])

いくつかのグループを探していますが(異なる日のデータがあるため)、次のように返されます。

{
    "_id" : {
        "month" : 8,
        "day" : 17,
        "year" : 292278994
    },
    "count" : 64.0
}

ここで間違っていることはありますか?

4

1 に答える 1

2

そのようにタイムスタンプから日付オブジェクト表現を作成することはできません。算術演算子を使用して、いくつかの算術操作を行う必要があります。つまり$add、エポックから 0 ミリ秒として日付を表すオブジェクト コンストラクターへのタイムスタンプnew Date(0)です (短い形式ではありますが)。

合計{ "$add": ["$time", new Date(0)] }は、新しい日付オブジェクトになります。したがって、これをオペレーターと一緒に置くと、$dateToStringこのパイプラインを実行して目的の結果を得ることができます。

db.convo_log.aggregate([
    {
        "$project": {
            "formattedDate": {
                "$dateToString": {
                    "format": "%Y-%m-%d",
                    "date": { "$add": ["$time", new Date(0)] }
                }
            }
        }
    },
    {
        "$group": {
            "_id": "$formattedDate",
            "count": { "$sum": 1 }
        }
    }
])
于 2016-09-28T12:20:25.843 に答える