복붙노트

[MONGODB] mongod를 사용하여 UTC에 날짜를 저장할 때 어떻게 시간대의 문제를 다루는?

MONGODB

mongod를 사용하여 UTC에 날짜를 저장할 때 어떻게 시간대의 문제를 다루는?

나는 각 문서가 일부 속성과 UTC 타임 스탬프가있는 MongoDB를 수집합니다. 나는 컬렉션에서 데이터를 끌어와 나는 사용자 인터페이스에 대한 몇 가지 차트를 표시 컬렉션에서 데이터를 사용하기 때문에 집계 프레임 워크를 사용합니다. 그러나, 나는 사용자의 시간대에 따라 집계를 할 필요가있다. 내가 (다른 방법으로 브라우저에서 또는에서 요청에서 전달) 사용자의 시간대를 알고 가정하면 [클라이언트] 시간대를 기반으로 집계 집계 프레임 워크를 사용하는 방법은 없나요?

해결법

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

    1.당신이 현재 MongoDB를 발행 SERVER-6310에서 논의되고 요구하고 있습니다.

    당신이 현재 MongoDB를 발행 SERVER-6310에서 논의되고 요구하고 있습니다.

    나는 토론 스레드에서 링크에서 이것을 발견했다.

    문제는 SQL 데이터베이스와 NoSQL의 데이터베이스를 포함하여 날짜별로 어떤 그룹, 일반적입니다. 사실, 나는 최근에 RavenDB의에이 머리를 해결. 문제와 여기에 RavenDB 솔루션의 좋은 설명이있다.

    MongoDB의 문제는 내가 위의 의견에 설명 된 것과 유사한 해결 방법을 설명합니다. 당신은 당신이 대신들에 의해 관심, 그리고 그룹입니다 로컬 시간을 미리 계산.

    이 두 접근 방식을 가진 세계의 모든 시간대를 커버하기 어려울 것이다. 당신은 내가 RavenDB 문서에서 설명하는 당 사무실 접근 방식으로, 사용자 기반에 대한 이해가 대상 지역의 작은 소수에 결정해야합니다.

    업데이트 :이 문제는 2017년 7월 (버전 3.5.11)에서 MongoDB를에 해결되었다. 이 솔루션은 위의 첫 번째 링크에 설명되어 있지만, 한마디로 그들은 집계 식의 날짜에 대한 새로운 객체 형식을 도입했습니다 : {날짜 : 시간대 : } 집계 할 때 사용하는 시간대를 지정할 수 있습니다 그 . 몽고 워드 프로세서의 또 다른 예를 들어 여기를 참조하십시오.

  2. ==============================

    2.이외에도 매트 존슨 언급 서버 6310에서, 다른 하나의 해결 방법에 UTC 시간대에서 추가하거나 뺄 $ 프로젝트 연산자를 사용하는 것입니다 올바른 로컬 영역에 "시간을 이동". 당신 밝혀 추가 또는 밀리 초 단위로 시간을 뺄 수 있습니다.

    이외에도 매트 존슨 언급 서버 6310에서, 다른 하나의 해결 방법에 UTC 시간대에서 추가하거나 뺄 $ 프로젝트 연산자를 사용하는 것입니다 올바른 로컬 영역에 "시간을 이동". 당신 밝혀 추가 또는 밀리 초 단위로 시간을 뺄 수 있습니다.

    예를 들어, 내가 orderTime라는 날짜 필드가 가정. 나는 EDT를 조회하고 싶습니다. 즉 UTC -4 시간입니다. 즉 4 * 60 * 60 * 1000 밀리 초입니다.

    나는 다음 투사를 작성합니다 그래서 내 모든 레코드에 대한 현지 시간으로 day_ordered하세요 :

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

    3.모든 접근 방식은 완벽하게 잘 작동 위의 제안하지만, MongoDB를 새로운 버전이 있기 때문에, 2.6에서 당신이 따라서 그룹화하기 전에 $ 프로젝트의 필요성을 피하기 위해, 당신은 즉석에서 변수를 만들 수있게된다 집계 프레임 워크하자 $를 사용할 수 있습니다. 이제 지역화 된 시간을 잡아 것이다 있도록 $의 변수를 만들고 $ 그룹 연산자를 사용할 수 있습니다.

    모든 접근 방식은 완벽하게 잘 작동 위의 제안하지만, MongoDB를 새로운 버전이 있기 때문에, 2.6에서 당신이 따라서 그룹화하기 전에 $ 프로젝트의 필요성을 피하기 위해, 당신은 즉석에서 변수를 만들 수있게된다 집계 프레임 워크하자 $를 사용할 수 있습니다. 이제 지역화 된 시간을 잡아 것이다 있도록 $의 변수를 만들고 $ 그룹 연산자를 사용할 수 있습니다.

    뭔가 같은 :

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

    공지 사항 당신이 $를 사용하는 블록 / 변수의 정의 안에하자, 그 블록 / 변수의 값이 "에서"서브 표현식의 반환 값, 정의 바르 위가 사용되는 경우.

  4. ==============================

    4.나는 몽구스 플러그인 정상화 저장된 날짜 시간대에 해결책을 발견했다.

    나는 몽구스 플러그인 정상화 저장된 날짜 시간대에 해결책을 발견했다.

  5. from https://stackoverflow.com/questions/18287493/how-to-deal-with-the-timezone-issue-when-storing-dates-in-utc-using-mongod by cc-by-sa and MIT license