0

내 첫 번째 StackOverflow 게시물! Pentaho Report Designer epoch 타임 스탬프 별 MongoDB 그룹화

은 내가 MongoDB를 수집라는 user_sessions이 - 하나의 문서는 다음과 같습니다 : 나는 펜타의 보고서 디자이너 (5.1)를 사용하여 보고서를 만들려고 해요

{ 
    "_id" : ObjectId("53e352bbed3e4af00d8b459a"), 
    "active_date" : 1407406779727, 
    "auth_token" : "WObDF9KO6n1V34lgjlFIoXoiEmOH9CM8", 
    "device_token" : "3474ac2d5aa9c7dc933bd4548c2dd6ea3d8a9592dad1c1a807c06ac2c8459205", 
    "device_type" : "1", 
    "end_time" : "", 
    "sessionid" : "", 
    "start_time" : 1407406779727, 
    "userid" : "53e352bbed3e4af00d8b4599" 
} 

. 나는이 쿼리 출력에 사용자 세션의 총 수를 처리했다 : 대단한

[ 
     { $group: { _id: null, count: { $sum: 1 } } } 
] 

합니다.

그러나 날짜별로 세션 수를 표시하고 싶습니다.

내가 그 콜렉션에 대해이 PHP 스크립트 (PHP는 몽고 드라이버를 사용하여) 실행하면 :

UserID: 53dfa1a7ed3e4aef0d8b456b, StartTime: 2014-08-05 
UserID: 53e075deed3e4af00d8b4570, StartTime: 2014-08-05 
UserID: 53e079c9ed3e4af00d8b4573, StartTime: 2014-08-05 
UserID: 53e07f8ded3e4aef0d8b4580, StartTime: 2014-08-05 
UserID: 53e081f9ed3e4aef0d8b4583, StartTime: 2014-08-05 
UserID: 53e352bbed3e4af00d8b4599, StartTime: 2014-08-07 
UserID: 53e9fb9eed3e4af00d8b45a3, StartTime: 2014-08-12 
UserID: 53f215f6ed3e4aef0d8b45a3, StartTime: 2014-08-19 
UserID: 53f3eeb7ed3e4aef0d8b45a7, StartTime: 2014-08-20 
UserID: 54083e94ed3e4af00d8b45b0, StartTime: 2014-09-04 
UserID: 5412cd29ed3e4aef0d8b45bc, StartTime: 2014-09-12 
UserID: 54175625ed3e4aef0d8b45c0, StartTime: 2014-09-16 
UserID: 54351b7ced3e4af00d8b45ff, StartTime: 2014-10-08 
UserID: 5444f1dced3e4a56718b45bb, StartTime: 2014-10-20 
UserID: 54475d48ed3e4af00d8b4628, StartTime: 2014-10-22 
UserID: 5449cc77ed3e4a79638b4592, StartTime: 2014-10-24 
UserID: 53e3c875ed3e4af00d8b459d, StartTime: 2014-10-24 
UserID: 544f6bb7ed3e4af00d8b464a, StartTime: 2014-10-28 
UserID: 544de95aed3e4a56718b45f2, StartTime: 2014-10-31 
UserID: 545b125c4a4ddd30048b4567, StartTime: 2014-11-06 

환상적인 :

$connection = new Mongo("mongodb://$dbhost"); 
$c_us = $db->user_session; 
$cursor = $c_us->find(); 
foreach ($cursor as $document) { 
    echo "<br/>UserID: " . $document['userid'] . ", StartTime: "; 
    $epoch = $document['start_time']; 
    echo date('Y-m-d',$epoch/1000); 
} 

내가이 출력을 얻을를!

그러나 날짜 수 (및 월/날짜)로 세션 수를 계산하려면 어떻게해야합니까?

2014-08-05 5 
2014-08-07 1 
. 
. 
. 
2014-10-24 2 

과 user_session 스키마 감안할 때

Month/Year  Count 
Aug 2014  9 
Sep 2014  3 
Oct 2014  7 
Nov 2014  1 

, 내가 start_time을에 신기원 시간을 변환 할 수 있습니다 방법 :

그래서 위의를 위해,이 같은 보고서를 필요 월/년 및 계산?

내 키워드 연구는 내가 할 수있는 것을 제공하지 못했습니다.

나는 손실에 처해있다. 검색 용어로 무엇을 입력해야합니까? 누군가 포인터를 줄 수 있습니까?

정말 감사하겠습니다.

감사

브래드

+0

죄송합니다. pentaho 또는 PHP에 익숙하지 않지만 MongoDB에 사용할 수있는 훌륭한 날짜 수집기가 있습니다. http://docs.mongodb.org/manual/reference/operator/aggregation/# 날짜 연산자 – ranman

+0

@ranman! 감사! 나는 $ month 링크를 따라 갔고 [link] http://docs.mongodb.org/manual/reference/operator/aggregation/month/#exp._S_month [/ link]로 끝나고 예제를 변경했지만이 오류가 발생했습니다. : 오류 : "스택 추적 인쇄"@ () @ src/mongo/shell/utils.js : 37 (객체 배열) @ src/mongo/shell/collection.js : 866 15 캐치되지 않는 예외 : (쉘) @ 집계 실패 : { \t "에 errmsg": "예외 : 날짜에 BSON 유형 NumberDouble에서 변환 할 수 없습니다", \t "코드"16006, \t "확인" : 0 } ' – bradzo

답변

0

그냥 기록을 위해, 다음과 같이이 date aggregation operators 당신이 집계 프레임 워크에 대한 그룹화 키에 $year$month$dayOfMonth 등을 해부하는 데 사용할 수 있습니다 :

db.collection.aggregate([ 
    { "$group": { 
     "_id": { 
      "year": { "$year": "$start_time" }, 
      "month": { "$month": "$start_time" }, 
      "day": { "$dayOfMonth": "$start_time" } 
     }, 
     "count": { "$sum": 1 } 
    }} 
]) 

"에포크 타임 스탬프"값에 익숙하다면이 기본 일치 항목을 항상 사용할 수 있습니다 "날짜"객체와 일반적으로 "날짜 수학"과 케이 획기적인 타임 스탬프가 필요한 값으로 반올림 생산 : 거기에 기본 트릭은 당신이 "빼기"또는에서 다른 유사한 계산을 할 때 존재로

db.collection.aggregate([ 
    { "$group": { 
     "_id": { 
      "$subtract": [ 
       { "$subtract": [ "$start_time", new Date("1970-01-01") ] }, 
       { "$mod": [ 
        { "$subtract": [ "$start_time", new Date("1970-01-01") ] }, 
        1000 * 60 * 60 * 24 
       ]} 
      ] 
     }, 
     "count": { "$sum": 1 } 
    }} 
) 

하나의 "날짜"객체를 다른 객체로 반환하면 결과는 객체와 밀리 초 차이가됩니다.주어진 예제에서 (1000 * 60 * 60 * 24) 이것은 시간이 일일과 같으며 모듈로 값은 현재 날짜로 반올림됩니다.

이것은 "timestamp"값을 실제로 받기를 원하는 날짜 집계 연산자에 대한 대체 접근법을 제공합니다.

집계 파이프 라인에 대한 모든 입력은 제출시 "직렬화"되므로 드라이버가 지원하는 모든 언어의 유효한 "dat 객체"는 올바른 입력 값으로 끝납니다. 우리는 여기에있는 "신기원"날짜를 사용하여 콜렉션에있는 날짜 오브젝트 값을 정수로 "변환"합니다.

출력 내용에 따라 다릅니다. 어떤 사람들은 "정수"형식을 새로운 "날짜"객체로 쉽게 형변환하는 것을 선호합니다. 일부는 개별 필드 파트에 만족합니다.

+0

감사합니다. @ Neil - 첫 번째 코드를 ("collection"을 "user_session"으로 바꾼)이 오류가 발생했습니다 : catch되지 않은 예외 : 집계가 실패했습니다 : { \t "errmsg": "예외 : BSON 유형에서 변환 할 수 없습니다. NumberDouble 날짜 ", \t"코드 "16006, \t"확인 ": 0 } 와 2 예 : 캐치되지 않는 예외 : 집계 실패 : { \t"에 errmsg를 ":"예외 : 캔트 $의 빼기 aDate을 from NumberDouble ", \t"코드 ": 16556, \t"ok ": 0 } – bradzo

+0

@bradzo 이는 "날짜"유형을 실제로 저장하지 않고 숫자 값을 타임 스탬프로 저장한다는 의미입니다. 값이 이미 "기원"타임 스탬프 값이어야하므로 날짜 객체의 빼기없이 ** 초 ** 방법을 사용하십시오. 아마도 밀리 세컨드가 아니기 때문에 데이터를 살펴보고 선택적으로 '1000'승수를 버리십시오. –

+0

# 감사합니다. #subtract 항목을 삭제하면 원래 게시물에 나와있는 것과 같은 결과를 얻을 수 있습니다. 즉 항목 수 : 20입니다. 그 시대 시간 형식을 변환하는 방법을 모르겠습니다 (PHP 스크립트에서/1000을 사용하여 올바른 날짜를 지정)를 날짜 객체로 변환합니다. 나는 그것이 불가능하다는 것을 읽었다. 아마도 나는 Groovy 스크립트를 사용해야한다. (궁극적 인 쿼리는 Pentaho 보고서 서버에 의해 실행됨을 기억하자.) - 도움을 주셔서 감사합니다. – bradzo

관련 문제