복붙노트

[MONGODB] MongoDB의 로컬 시간대에서 집계

MONGODB

MongoDB의 로컬 시간대에서 집계

나는 MongoDB를 이탈리아에서 사용되는 nodejs에서 응용 프로그램을 구축하고있다. 이탈리아 시간대는 02입니다 : 00. 몽고는 UTC 날짜를 저장 11 개 7 월 오전 다음 10 년 7 월 오후 11시로 저장됩니다 : 01에서 일부 데이터를 저장 중 하나가 경우에 의미합니다. 우리는 텍사스 카운트 현명한 날짜를 표시해야합니다. 그래서 날짜에 쿼리 그룹을했다. 그러나 전날에 그 텍사스를 보여줍니다. 무엇은이를 위해 해결해야합니다.

> db.txs.insert({txid:"1",date : new Date("2015-07-11T01:00:00+02:00")})

> db.txs.insert({txid:"2",date : new Date("2015-07-11T05:00:00+02:00")})

> db.txs.insert({txid:"3",date : new Date("2015-07-10T21:00:00+02:00")})

> db.txs.find().pretty()

{
        "_id" : ObjectId("55a0a55499c6740f3dfe14e4"),
        "txid" : "1",
        "date" : ISODate("2015-07-10T23:00:00Z")
}
{
        "_id" : ObjectId("55a0a55599c6740f3dfe14e5"),
        "txid" : "2",
        "date" : ISODate("2015-07-11T03:00:00Z")
}
{
        "_id" : ObjectId("55a0a55699c6740f3dfe14e6"),
        "txid" : "3",
        "date" : ISODate("2015-07-10T19:00:00Z")
}

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

  { "_id" : { "day" : 11, "month" : 7, "year" : 2015 }, "count" : 1 }
  { "_id" : { "day" : 10, "month" : 7, "year" : 2015 }, "count" : 2 }

은 2 7 월 10 일에 TXS 7 월 11 일을 보여줍니다. 그러나 우리는 7월 11일 10 7 월 1 TX 2 TXS을 표시해야합니다.

그것은 이탈리아 때 실제로 7월 11일했다

db.txs.insert({txid:"1",date : new Date("2015-07-11T01:00:00+02:00")})

일어났다하지만 저장된 날짜 등을 몽고 :

ISODate("2015-07-10T23:00:00Z")

해결법

  1. ==============================

    1.당신이 할 수 "로컬"시간 선택 UI에서 등을 위해 오프셋 시간대에 의해 "쿼리"번 수정 될 갈까요 있도록 시간대 다루기하는 "클라이언트"문제입니다. 동일 기간은 현지 시각 표시되어야하는 UI 디스플레이 간다.

    당신이 할 수 "로컬"시간 선택 UI에서 등을 위해 오프셋 시간대에 의해 "쿼리"번 수정 될 갈까요 있도록 시간대 다루기하는 "클라이언트"문제입니다. 동일 기간은 현지 시각 표시되어야하는 UI 디스플레이 간다.

    그리고 같은 당신의 응집 원리에 적용됩니다. 그냥 오프셋 시간대로 조정합니다. 대신 날짜 집계 연산자를 사용하는 날짜 수학을 적용합니다 :

    var tzOffset = 2;
    
    db.txs.aggregate([
        { "$group": {
            "_id": { 
                "$subtract": [
                    { "$add": [ 
                        { "$subtract": [ "$date", new Date("1970-01-01") ] },
                        tzOffset * 1000 * 60 * 60
                    ]},
                    { "$mod": [
                        { "$add": [ 
                            { "$subtract": [ "$date", new Date("1970-01-01") ] },
                            tzOffset * 1000 * 60 * 60
                        ]},
                        1000 * 60 * 60 * 24
                    ]}
                ]
            },
            "count": { "$sum": 1 }
        }}
    ]).forEach(function(doc){ 
        printjson({ "_id": new Date(doc._id), "count": doc.count }) 
    });
    

    어떤 당신이 제공 :

    { "_id" : ISODate("2015-07-10T00:00:00Z"), "count" : 1 }
    { "_id" : ISODate("2015-07-11T00:00:00Z"), "count" : 2 }
    

    당신이 서로 빼기 하나의 BSON 날짜를 $ 그래서 결과는 유닉스 시대부터의 밀리 세컨드 수입니다. 간단히 "추가"를 "시간대 오프셋"전달 시간 뒤에 음수 대 하나 possitive 됨으로써 다시 조정을 다시 시간 값 유효 millseconds 변환.

    당시 라운딩 만 현재 날짜로 조정 아웃 날짜 라운드에 "하루에 밀리 세컨드의 수"를 제거에서 나머지를 얻을 수있는 간단한 모듈로 $의 모드입니다.

    여기에 결과 숫자 값 이후 날짜로 다시 주조 다시 쉽게 모든 언어 라이브러리 "날짜"객체 생성자의 인수로 시대의 밀리 초 (또는 초) 걸릴.

    그래서 다시,이 데이터가 저장되는 방법을 channging에 대해 "클라이언트"의 "로케일"에서 현재까지 데이터 응답을 수정하지에 대한 모든 것입니다. 응용 프로그램에서 진정한 지역을 원하는 경우에 당신은 그냥 위에서 제시, 사방 시간대 오프셋에 대한 수정 사항을 적용 할 수 있습니다.

    --

    사실 당신은 좀 더 일 수학으로 집계 프레임 워크 자체에 날짜를 만들 수 있습니다. 간단하게 변환 된 날짜에 획기적인 날짜 등을 추가 :

    db.txs.aggregate([
        { "$group": {
            "_id": { 
                "$add": [
                    { "$subtract": [
                        { "$add": [ 
                            { "$subtract": [ "$date", new Date(0) ] },
                            tzOffset * 1000 * 60 * 60
                        ]},
                        { "$mod": [
                            { "$add": [ 
                                { "$subtract": [ "$date", new Date(0) ] },
                                tzOffset * 1000 * 60 * 60
                            ]},
                            1000 * 60 * 60 * 24
                        ]}
                    ]},
                    new Date(0);
                ]
            },
            "count": { "$sum": 1 }
        }}
    ])
    
  2. ==============================

    2.3.6 시간대 첨가 한 몽고 버전에서 문서를 몽고

    3.6 시간대 첨가 한 몽고 버전에서 문서를 몽고

    시간대와 추출 날짜 부분 식입니다

    { date: <dateExpression>, timezone: <tzExpression> }
    

    날짜 부분을 가져 오는 동안 우리는 어느 시간대를 지정하거나 상쇄 할 수

    관로

    > db.txs.aggregate([
    ...     { $group:{
    ...         _id: { 
    ...             day: {$dayOfMonth: {date :"$date", timezone : "Europe/Rome"}}, // timezone
    ...             month: {$month: {date : "$date", timezone : "+02:00"}}, //offset
    ...             year: {$year: {date : "$date", timezone : "+02:00"}} //offset
    ...         },
    ...         count:{$sum:1}
    ...     }}
    ... ])
    

    결과

    { "_id" : { "day" : 10, "month" : 7, "year" : 2015 }, "count" : 1 }
    { "_id" : { "day" : 11, "month" : 7, "year" : 2015 }, "count" : 2 }
    > 
    

    시간대의 목록

  3. from https://stackoverflow.com/questions/31353740/aggregating-in-local-timezone-in-mongodb by cc-by-sa and MIT license