2016-11-21 4 views
0

mongoDB를 처음 사용하면서 저는 Gmail API를 사용하여 Gmail에 액세스하는 python 파일에 의해 생성 된 콜렉션을 작성했습니다. 수신 된 이메일의 수가 가장 많은 요일의 시간을 찾기 위해 질의를하십시오. 여기 내 시도했다 :mongoDB aggregate() 이메일 객체 모음에서 이메일 시간 찾기

여기
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}}}}]) 

이메일 객체가 모습입니다 같은 :

{ 
"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 
} 

"이름이"날짜입니다 이메일의 날짜가 개체의 payload.headers 부분이며, "value"는 ISODate 형식의 날짜입니다. 이 쿼리는 $ max 명령없이 작동하며 모든 전자 메일에서 시간당 전자 메일 수를 제공합니다. 일단 $ max 명령을 입력하면 매시간 { "_id" : hour, "total" : 1 }이됩니다.

+0

$의 email_month ??? 그건 오타 야? – Veeram

답변

1

이와 같이해야합니다. 날짜와 시간별로 전자 메일을 그룹화하고 날짜별로 그룹화 할 최종 그룹을 날짜와 시간별로 그룹화하고 날짜별로 최대 전자 메일 수를 선택한 다음 시간별 전자 메일을 배열로 그룹화하는 첫 번째 그룹 단계. 이전 이메일 최대 개수를 배열의 개수와 비교하여 최대 이메일 시간 행을 필터링하고 일치하는 값을 반환하는 $ project 단계. 시간 만 얻으려면 끝에 다른 프로젝트 스테이지를 추가 할 수 있습니다.

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 } ] }