programing

mongod를 사용하여 날짜를 utc에 저장할 때 시간대 문제를 어떻게 처리합니까?

powerit 2023. 7. 7. 21:11
반응형

mongod를 사용하여 날짜를 utc에 저장할 때 시간대 문제를 어떻게 처리합니까?

각 문서에 몇 가지 속성과 UTC 타임스탬프가 있는 mongodb 컬렉션이 있습니다.컬렉션의 데이터를 사용하여 사용자 인터페이스에 일부 차트를 표시하기 때문에 컬렉션에서 데이터를 추출하고 집계 프레임워크를 사용해야 합니다.하지만 나는 사용자의 시간대에 따라 집계를 해야 합니다.사용자의 표준 시간대(브라우저에서 요청을 전달받거나 다른 방식으로 전달됨)를 알고 있다고 가정하면, 집계 프레임워크를 사용하여 [클라이언트] 표준 시간대를 기준으로 집계할 수 있는 방법이 있습니까?

Matt Johnson이 언급한 SERVER-6310을 제외하고, 한 가지 해결 방법은 다음과 같습니다.$project연산자는 UTC 시간대에서 "시간을 올바른 로컬 시간대로 이동"하기 위해 더하거나 뺄 수 있습니다.시간을 밀리초 단위로 추가하거나 뺄 수 있습니다.

예를 들어, 다음 날짜 필드가 있다고 가정합니다.orderTimeEDT에 대해 문의하고 싶습니다.그것은 UTC로부터 -4시간 거리입니다.그것은 4 * 60 * 60 * 1000 밀리초입니다.

그래서 저는 다음과 같은 투영을 작성하여 얻을 것입니다.day_ordered내 모든 기록에 대한 현지 시간:

db.table.aggregate( 
    { $project : { orderTimeLocal : { $subtract : [ "$orderTime", 14400000] } } },
    { $project : { day_ordered : { $dayOfYear : "$orderTimeLocal" } } })

위에서 제안한 모든 접근 방식은 완벽하게 작동하지만, 2.6의 새로운 버전의 mongodb가 있기 때문에 집계 프레임워크에서 사용할 수 있으며, 이를 통해 즉시 변수를 생성할 수 있으므로 다음 작업을 수행할 필요가 없습니다.$project그룹화하기 전에이제 다음을 사용하여 변수를 만들 수 있습니다.$let현지화된 시간을 유지하고, 그것을 사용할 것입니다.$group교환입니다.

다음과 같은 것:

db.test.aggregate([
   {$group: { 
        _id: { 
             $let: { 
                 vars: {  
                     local_time: { $subtract: ["$date", 10800000]} 
                 }, 
                 in: { 
                    $concat: [{$substr: [{$year: "$$local_time"}, 0, 4]}, 
                              "-", 
                              {$substr: [{$month: "$$local_time"}, 0, 2]}, 
                              "-", 
                              {$substr: [{$dayOfMonth: "$$local_time"}, 0, 2]}]
                 }
              }
         }, 
         count: {$sum: 1}
     }
 }])

사용 중인 주의 사항$let블록/게이트웨이의 내부 정의이며, 해당 블록/게이트웨이의 값은 하위 표현식의 반환된 값입니다."in"위에서 정의한 변수가 사용됩니다.

당신이 요청하는 것은 현재 MongoDB issue SERVER-6310에서 논의 중입니다.

저는 이것을 토론 스레드의 링크에서 찾았습니다.

이 문제는 SQL 데이터베이스 및 NoSQL 데이터베이스를 포함하여 날짜별로 그룹화할 때 공통적으로 발생합니다.사실, 저는 최근에 RavenDB에서 이 문제를 정면으로 다루었습니다.여기에 문제에 대한 좋은 설명과 RavenDB 솔루션이 있습니다.

MongoDB 문제는 해결 방법을 논의하는데, 이는 위에서 설명한 것과 유사합니다.관심 있는 현지 시간을 미리 계산하고 대신 해당 시간으로 그룹화합니다.

어느 접근법으로도 세계의 모든 시간대를 커버하기는 어려울 것입니다.RavenDB 기사에서 설명한 사무실별 접근 방식과 같이 사용자 기반에 적합한 소수의 대상 영역을 결정해야 합니다.

업데이트: 이 문제는 2017년 7월에 MongoDB에서 해결되었습니다(버전 3.5.11).솔루션은 위의 첫 번째 링크에 설명되어 있지만, 간단히 말해서 집합 식의 날짜에 대한 새로운 개체 형식을 도입했습니다.{ date: <dateExpression>, timezone: <tzExpression> }집계 시 사용할 시간대를 지정할 수 있습니다.Mongo 문서의 다른 예는 여기를 참조하십시오.

언급URL : https://stackoverflow.com/questions/18287493/how-to-deal-with-the-timezone-issue-when-storing-dates-in-utc-using-mongod

반응형