복붙노트

[MONGODB] ISODate 객체 밀리 초 변환 날짜

MONGODB

ISODate 객체 밀리 초 변환 날짜

나는 집계 프레임 워크에 내장 된 날짜 사업자 (등 $ 시간, $ 달,)를 사용할 수 있도록 ISODate에 타임 스탬프 (밀리 초)로 저장 변환 날짜에 시간이 필요하여 MongoDB의 컬렉션에서 집계 기록에 노력하고 있습니다

기록으로 저장됩니다

{ 
"data" : { "UserId" : "abc", "ProjId" : "xyz"}, 
"time" : NumberLong("1395140780706"),
"_id" : ObjectId("532828ac338ed9c33aa8eca7") 
} 

나는 다음과 같은 유형의 집계 쿼리를 사용하는 것을 시도하고있다 :

db.events.aggregate(
    { 
       $match : { 
         "time" : { $gte : 1395186209804, $lte : 1395192902825 } 
       } 
    }, 
    { 
       $project : {
         _id : "$_id", 
         dt : {$concat : (Date("$time")).toString()} // need to project as ISODate
       } 
    },
    // process records further in $project or $group clause
)

이는 폼의 결과를 얻게

{
    "result" : [
        { 
            "_id" : ObjectId("5328da21fd207d9c3567d3ec"), 
            "dt" : "Fri Mar 21 2014 17:35:46 GMT-0400 (EDT)" 
        }, 
        { 
            "_id" : ObjectId("5328da21fd207d9c3567d3ed"), 
            "dt" : "Fri Mar 21 2014 17:35:46 GMT-0400 (EDT)" 
        }, 
            ... 
} 

나는 날로부터 시간, 일, 월, 연도를 추출하고 싶지만 시간이 문자열로 앞으로 예상되기 때문에 나는 집계 프레임 워크에 내장 된 날짜 사업자 ($ 시간 등)을 사용할 수 없습니다입니다.

어떻게 언젠가 다음과 같이 할 ISO 날짜에 밀리 초에서 시간을 변환 할 수 있습니다 :

db.events.aggregate(
    {
        $match : { 
            "time" : { $gte : 1395186209804, $lte : 1395192902825 } 
        }
    },
    {
        $project : {
            _id : "$_id",
            dt : <ISO date from "$time">
        }
    },
    { 
        $project : {
            _id : "$_id",
            date : { 
                hour : {$hour : "$dt"} 
            }
        }
    }
)

해결법

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

    1.나는 그것을 할 방법이 없습니다 가정합니다. 때문에 통합 프레임 워크는 네이티브 코드로 작성되었습니다. V8 시리즈 엔진을 활용하지. 따라서 자바 스크립트의 모든 프레임 워크 내에서 먹힐없는 (그리고 통합 프레임 워크는 훨씬 빠르게 실행하는 이유이기도합니다). 지도 축소 /이 문제를 해결하는 방법이지만, 통합 프레임 워크는 확실히 훨씬 더 나은 성능을 얻었다.

    나는 그것을 할 방법이 없습니다 가정합니다. 때문에 통합 프레임 워크는 네이티브 코드로 작성되었습니다. V8 시리즈 엔진을 활용하지. 따라서 자바 스크립트의 모든 프레임 워크 내에서 먹힐없는 (그리고 통합 프레임 워크는 훨씬 빠르게 실행하는 이유이기도합니다). 지도 축소 /이 문제를 해결하는 방법이지만, 통합 프레임 워크는 확실히 훨씬 더 나은 성능을 얻었다.

    지도 정보 / 성능 감소,이 스레드를 읽어 보시기 바랍니다.

    또 다른 방법은, 통합 프레임 워크에서 "원시"결과를 얻을 수있을 것입니다 그것을 해결 JSON 배열에 넣어합니다. 그런 다음 자바 스크립트를 실행하여 변환을 수행. 등으로 정렬 :

    var results = db.events.aggregate(...);
    reasult.forEach(function(data) {
        data.date = new Date(data.dateInMillionSeconds);
        // date is now stored in the "date" property
    }
    
  2. ==============================

    2.사실, 수, 트릭 () 제로 밀리 초 날짜에 밀리 초 단위로 시간을 추가하는 구문을 사용하여 객체와 유사 :

    사실, 수, 트릭 () 제로 밀리 초 날짜에 밀리 초 단위로 시간을 추가하는 구문을 사용하여 객체와 유사 :

    dt : {$add: [new Date(0), "$time"]}
    

    나는 결과를 생성하는 이상에서 집계를 수정 :

    db.events.aggregate(
        {
            $project : {
                _id : "$_id",
                dt : {$add: [new Date(0), "$time"]}
            }
        },
        { 
            $project : {
                _id : "$_id",
                date : { 
                    hour : {$hour : "$dt"} 
                }
            }
        }
    );
    

    그 결과 (샘플의 데이터를 하나 개의 항목으로)입니다 :

    {
      "result": [
        {
          "_id": ObjectId("532828ac338ed9c33aa8eca7"),
          "date": {
            "hour": 11
          }
        }
      ],
      "ok": 1
    }
    
  3. ==============================

    3.당신이 필요로하는 모든이 $의 추가 연산자를 사용하여 약간의 날짜 "수학"입니다 유효한 BSON 날짜를 반환합니다. 당신은 타임 스탬프에 새로운 날짜 (0)을 추가해야합니다. 새로운 날짜 (0) 유닉스 시대 이후의 밀리 초 수 일 (1970 년 1 월 1 일)을 나타내며 새로운 날짜 속기이다 ( "1970-01-01").

    당신이 필요로하는 모든이 $의 추가 연산자를 사용하여 약간의 날짜 "수학"입니다 유효한 BSON 날짜를 반환합니다. 당신은 타임 스탬프에 새로운 날짜 (0)을 추가해야합니다. 새로운 날짜 (0) 유닉스 시대 이후의 밀리 초 수 일 (1970 년 1 월 1 일)을 나타내며 새로운 날짜 속기이다 ( "1970-01-01").

    db.events.aggregate([
        { "$match": { "time": { "$gte" : 1395136209804, "$lte" : 1395192902825 } } },
        { "$project": { 
            "hour": { "$hour": { "$add": [ new Date(0), "$time" ] } }, 
            "day": { "$dayOfMonth":  { "$add": [ new Date(0), "$time" ] } },
            "month": { "$month": { "$add": [ new Date(0), "$time" ] } },
            "year": { "$year":  { "$add": [ new Date(0), "$time" ] } } 
        }} 
    ])
    

    어떤 수율 :

    {
        "_id" : ObjectId("532828ac338ed9c33aa8eca7"),
        "hour" : 11,
        "day" : 18,
        "month" : 3,
        "year" : 2014
    }
    
  4. ==============================

    4.몽고 4.0 시작 (긴에서이 경우) 날짜로 여러 유형으로 변환 할 수있는 새로운 $의 TODATE 집계 연산자가있다 :

    몽고 4.0 시작 (긴에서이 경우) 날짜로 여러 유형으로 변환 할 수있는 새로운 $의 TODATE 집계 연산자가있다 :

    // { time: NumberLong("1395140780706") }
    db.collection.aggregate({ $set: { time: { $toDate: "$time" } } })
    // { time: ISODate("2014-03-18T11:06:20.706Z") }
    

    그리고 그것의 시간을 얻을 수 있습니다 :

    // { time: NumberLong("1395140780706") }
    db.collection.aggregate({ $project: { hour: { $hour: { $toDate: "$time" } } } })
    // { hour: 11 }
    
  5. ==============================

    5.ISO처럼되지 날짜 형식 : 'XXXXXXX 2000년 11월 2일'$ 프로젝트에서 내 새로운 날짜가 같은 문자열 형식을 반환 때문에, 그 옵션을 모두 사용하지만 여전히 실패 : 누구나 ( '2000년 11월 2일 XXXXXXX') 사람 내가 이것을 사용과 같은 문제가 있습니다.

    ISO처럼되지 날짜 형식 : 'XXXXXXX 2000년 11월 2일'$ 프로젝트에서 내 새로운 날짜가 같은 문자열 형식을 반환 때문에, 그 옵션을 모두 사용하지만 여전히 실패 : 누구나 ( '2000년 11월 2일 XXXXXXX') 사람 내가 이것을 사용과 같은 문제가 있습니다.

    db.events.aggregate(
        {
            $project : {
                _id : "$_id",
                dt : {$add: [new Date(0), "$time"]}
            }
        },
        { 
            $project : {
                _id : "$_id",
                "year": { $substr: [ "$dt", 0, 4 ] },
                "month": { $substr: [ "$dt", 5, 2] },
                "day": { $substr: [ "$dt", 8, 2 ] }
            }
        }
    );
    

    결과가 될 것입니다

     { _id: '59f940eaea87453b30f42cf5',
        year: '2017',
        month: '07',
        day: '04' 
    },
    

    당신은 당신이 하위 집합 할 문자열에 따라 원하는 경우에 당신은 당신이 그룹은 그 수, 시간 또는 분을 얻을 수 있습니다 다시 같은 일, 월 또는 연도 별

  6. from https://stackoverflow.com/questions/22698265/convert-date-from-milliseconds-to-isodate-object by cc-by-sa and MIT license