2014-04-17 3 views
2

유닉스 타임 스탬프 형식으로 항목 생성 시간을 저장하고 있습니다. 그리고 이제는 예를 들어, 연도별로 그것을 집계하고 싶습니다. 그러나, 불행하게도, 정상적으로는 여기 mongodb의 타임 스탬프로 데이터 집계

는 소스 데이터는 ..., 작동하지 않습니다

db.invoice.find({id: '01f96c0d4254cdd69692d97c3909fb6dff75066b'}, {created: 1, amount: 1}) 
{ "_id" : ObjectId("534801e8e71709fab334bdd9"), "amount" : 345, "created" : 1397661552 } 

하지만 난 그렇게하려고하면

db.invoice.aggregate(
{$match: {id: '01f96c0d4254cdd69692d97c3909fb6dff75066b'}}, 
{$group: 
    {_id: { year: {$year: new Date('$created' * 1000)} }, 
    total: {$sum: '$amount'}} 
} 
) 

을 나는

를 얻을 수
"result" : [ 
    { 
     "_id" : { 
      "year" : 292278994 
     }, 
     "total" : 345 
    } 
], 
"ok" : 1 

올해가 이상합니다 ...

P.

db.invoice.aggregate(
{$match: {id: '01f96c0d4254cdd69692d97c3909fb6dff75066b'}}, 
{$group: 
    {_id: { year: {$year: new Date(1397661552000)} }, 
    total: {$sum: '$amount'}} 
} 
) 

가 작동하는 것 같다 연도를 2014

+0

첫 번째 예제에서는 왜 '$ created'를 1000으로 곱하고 두 번째에서는 1397661552 만 전달합니까? – d1mitar

+0

그것이 잘못 인쇄되었지만 죄송합니다. –

답변

3

$year 연산자를 출력하고 설계로 date aggregation 사업자 모두가 정확히 작동 : 나는 날짜 기능의 정확한 시간을 가리키는 경우. 그러나 여기서의 문제는 "created"가 실제로는 BSON date type이 아니며 실제로는 신기원 시간 스탬프를 나타내는 숫자입니다.

그래서 당신은 실제로 같을 것이다 셸에서 이는 BSON date가 있다면 :

ISODate("2014-04-18T03:54:40.023Z") 

그런 다음 운영자가 작동합니다. 그러나 귀하의 경우에는 그렇지 않습니다. 왜냐하면 BSON 날짜 유형이 실제로는 내부적으로 획기적인 타임 스탬프이기 때문에 추가 저장 공간을 차지하지 않기 때문입니다.

하지만 당신의 "타임 스탬프"이후

는 번호는, 당신이해야 할 모든 당신이 원하는 년 경계 얻기 위하여 약간의 "날짜 수학"입니다 :

db.invoice.aggregate([ 
    { "$group": { 
     "_id": { 
      "$add": [ 
       { "$subtract": [ 
        "$created", 
        { "$mod": [ 
         "$created", 
         31536000   // 60 * 60 * 24 * 365 
        ]} 
       ]}, 
       950400     // correction 
      ] 
     }, 
     "total": { "$sum": "$amount" } 
    }} 
]) 

을 그리고 그 각각의 날짜를 설정해야합니다 가치가 그 해의 첫 번째 날로 간주되므로 연도별로 집계 할 수 있습니다.

"result" : [ 
    { 
     "_id" : { 
      "year" : 1388534400 
     }, 
     "total" : 345 
    } 
], 
"ok" : 1 

당신은 epoch converter 같은 사이트에서 결과에서 시대의 날짜를 확인하거나 단지 Date 객체로 공급 할 수 있습니다.