1

過去 24 時間のデータを取得するために、mongo 集計関数で DayHours でグループ化しようとしています。たとえば、イベントの時間が金曜日の 6:00 の場合、「DayHour」は 6-5 になります。次のクエリを使用して、時間ごとに簡単にグループ化できます。

db.api_log.aggregate([
    { '$group': { 
        '_id': { 
            '$hour': '$time'
        }, 
        'count': { 
          '$sum':1 
        } 
      } 
    },
    { '$sort' : { '_id': -1 } }
  ])

これを行うためのより良い方法があるように感じます。$project ステートメントで連結を試みましたが、文字列を連結できるのは mongo だけです (どうやら)。事実上、日と時間でグループ化する必要があるだけですが、それは完了します。ありがとうございました。

4

2 に答える 2

1

timeフィールドに が含まれていると仮定しますISODate。最後の 24 時間のみが必要な場合は、これを使用できます。

var yesterday = new Date((new Date).setDate(new Date().getDate() - 1));

db.api_log.aggregate(
    {$match: {time: {$gt: yesterday}}},
    {$group: {
        _id: {
            hour: {$hour: "$time"},
            day: {$dayOfMonth: "$time"},
        },
        count: {$sum: 1}
    }}
)          

日時間ごとの一般的なグループ化が必要な場合は、これを使用できます。

db.api_log.aggregate(
    {$group: {
        _id: {
            hour: {$hour: "$time"},
            day: {$dayOfMonth: "$time"},
            month: {$month: "$time"},
            year: {$year: "$time"}
        },
        count: {$sum: 1}
    }}
)
于 2013-11-05T08:09:59.757 に答える
0

また、これはそれ自体が答えではありません(答えを思いつくために今mongodbを持っていません)が、集約フレームワークだけでこれを行うことはできないと思います(間違っているかもしれないので、私は自分自身を説明します)。

.getTimestampメソッドを使用して、mongoId から日付と時刻の情報を取得できます。この情報をmongoクエリで出力できない問題(なんかdb.find({},{_id.getTimestamp})うまくいかない)。また、このフィールドで検索することもできません ( $where句を使用する場合を除く)。

したがって、達成できる場合は、reduce 関数で の出力に基づいてグループ化する mapreduce を使用してのみ行うことができますgetTimestamp

これが非常に頻繁に行うクエリである場合は、実際にdateドキュメントにフィールドを追加することをお勧めします。このフィールドを使用すると、データを適切に集約でき、インデックスを使用してすべてのコレクションをスキャンしないようにすることもできるからです ( $sort -1 で行いますが、$matchそれよりも大きい部分のみにcurrent date- 24 hours)。

コードがなくてもこれが役立つことを願っています。誰もこれに答えられない場合は、明日それで遊んでみます。

于 2013-11-05T07:26:36.433 に答える