3

誰かが集計関数を正しくするのを手伝ってくれるかどうか疑問に思っていました. 指定された日の 1 時間あたりのテキストの表示回数を数えようとしています。これまでのところ、私は持っています:

db.daily_data.aggregate(
  [
    { $project : { useragent: 1, datetime: 1, url: 1, hour: {$hour: new Date("$datetime")} } },
    { $match : { datetime: {$gte: 1361318400000, $lt: 1361404800000}, useragent: /.*LinkCheck by Siteimprove.*/i } },
    { $group : { _id : { useragent: "$useragent", hour: "$hour" }, queriesPerUseragent: {$sum: 1} } }
  ]
);

しかし、時間は常に0であるため、明らかに間違っています:

{
  "result" : [
    {
      "_id" : {
        "useragent" : "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.0) LinkCheck by Siteimprove.com",
        "hour" : 0
      },
      "queriesPerUseragent" : 94215
    }
  ],
  "ok" : 1
}

これもレコードの縮小された例です。

{
  "_id" : ObjectId("50fe63c70266a712e8663725"),
  "useragent" : "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.0) LinkCheck by Siteimprove.com",
  "datetime" : NumberLong("1358848954813"),
  "url" : "http://www.somewhere.com"
}

new Date("$datetime").getHours()また、関数の代わりに使用し$hourて同じ結果を得ようとしましたが、うまくいきませんでした。誰かが私が間違っている方向に私を向けることができますか?

ありがとう!

4

1 に答える 1

3

これは、問題に対する回答ではなく推奨事項です。

分析用の MongoDB では、計算するすべてのメトリクスについてバケット (ユースケースでは時間単位のバケット) を事前に集計することをお勧めします。

したがって、メトリクスについて、事前に集計されたコレクションを更新できます (クエリ時間を高速化します)。

db.user_agent_hourly.update({url: "your_url", useragent: "your user agent", hour: current_HOUR_of_DAY, date: current_DAY_Date}, {$inc: {counter:1}}, {upsert:true})

現在の日付の安定した日付値、つまり current_year/current_month/current_day 00:00:00 を指す必要があることを考慮してcurrent_DAY_Date、現在の日に受信したすべてのメトリックに同じ時:分:秒を使用します。

次に、このコレクションにクエリを実行して、次のように任意の期間の集計分析を抽出できます。

 db.user_agent_hourly.aggregate(
    {$match:{date:{$gte: INITIAL_DATE, $lt: FINAL_DATE}}},
    {$group:{ _id : { useragent: "$useragent", hour: "$hour" } ,queriesPerUseragent: {$sum: "$count"} } },
    {$sort:{queriesPerUseragent:-1}}
 )

特定のユーザー エージェントを使用して結果をフィルター処理する場合は、次のクエリを使用できます。

 db.user_agent_hourly.aggregate(
    {$match:{date:{$gte: INITIAL_DATE, $lt: FINAL_DATE, useragent: "your_user_agent"}}},
    {$group:{ _id : { useragent: "$useragent", hour: "$hour" }, queriesPerUseragent: {$sum: "$count"} } }
 )

PS: 受信したすべてのメトリックを別のコレクションに保存して、災害やその他のニーズが発生した場合に再処理できるようにします。

于 2013-02-22T11:41:53.073 に答える