2016-11-21 10 views
0

mongoDBが新しくなっています。私が扱っているコレクションは、gmail APIを使用して自分のgmailにアクセスするpythonファイルによって構築されました。受信した電子メールの数が最も多い曜日の時刻を検索するクエリを作成します。ここに私の試みました:電子メールの日付は「名前」は、日付とあるオブジェクトのpayload.headers部分であるmongoDB aggregate()電子メールオブジェクトのコレクションの電子メールの時刻を取得する

{ 
"id": string, 
"threadId": string, 
"labelIds": [ 
    string 
], 
"snippet": string, 
"historyId": unsigned long, 
"internalDate": long, 
"payload": { 
"partId": string, 
"mimeType": string, 
"filename": string, 
"headers": [ 
    { 
    "name": string, 
    "value": string 
    } 
], 
"body": users.messages.attachments Resource, 
"parts": [ 
    (MessagePart) 
] 
}, 
"sizeEstimate": integer, 
"raw": bytes 
} 

db.gmail_data2.aggregate(
[{$unwind: '$payload.headers' }, 
{$match:{'payload.headers.name':'Date'}}, 
{$project:{email_hour:{$hour:"payload.headers.value"}}}, 
{$group:{_id:"$email_hour",total:{$max:{$sum:1}}}}]) 

ここでは、電子メールのオブジェクトがどのように見えるかです"値"はISODate形式の日付です。クエリは$ maxコマンドなしで動作し、すべての電子メールのうち時間あたりの電子メールの数を示します。一度私が$ maxコマンドを置くと、それは毎時のために:{ "_id" : hour, "total" : 1 }を置きます。

+0

の$ email_month ???それはタイプミスですか? – Veeram

答えて

1

このようなことをする必要があります。最初の$ groupステージで、日付と時間で電子メールをグループ化し、各時間の電子メールをカウントし、最終グループを日付別にグループ化し、電子メールを1時間ごとに配列にプッシュしながら毎日の最大電子メールカウントを選択します。前の電子メールの最大カウントと配列のカウントを比較し、一致する値を返すことによって、最大メール時間の行をフィルタリングする$ project stage。時間を取得したい場合は、最後に別のプロジェクトステージを追加することができます。

aggregate(
    [{ 
     $unwind: '$payload.headers' 
    }, { 
     $match: { 
      'payload.headers.name': 'Date' 
     } 
    }, { 
     $group: { 
      _id: { 
       email_date: { 
        $dateToString: { 
         format: "%Y-%m-%d", 
         date: '$payload.headers.value' 
        } 
       }, 
       email_hour: { 
        $hour: '$payload.headers.value' 
       } 
      }, 
      count: { 
       $sum: 1 
      } 
     } 
    }, { 
     $group: { 
      _id: '$_id.email_date', 
      email_by_hour: { 
       $push: { 
        email_hour: '$_id.email_hour', 
        count: '$count' 
       } 
      }, 
      max_count: { 
       $max: '$count' 
      } 
     } 
    }, { 
     $project: { 
      _id: 0, 
      email_date: '$_id', 
      max_email_hour: { 
       $filter: { 
        input: '$email_by_hour', 
        as: 'item', 
        cond: { 
         $eq: ['$$item.count', '$max_count'] 
        } 
       } 
      } 
     } 
    }]) 

サンプル出力:プロジェクトの段階での$ email_hour対

{ "email_date" : "2016-11-21", "max_email_hour" : [ { "email_hour" : 1, "count" : 3 } ] } 
{ "email_date" : "2016-11-20", "max_email_hour" : [ { "email_hour" : 12, "count" : 2 } ] } 
関連する問題