복붙노트

[MONGODB] MongoDB의 날짜를 문자열로 변환

MONGODB

MongoDB의 날짜를 문자열로 변환

MongoDB의 쉘을 사용하여 사용자 정의 형식을 사용하여 날짜 문자열을 변환하는 방법이 있나요

지금까지 나는 "33 -0400 : 16 : 35 21 / 월 / 2012"으로 변환하는 것을 시도하고있다

에 DateFormatter 또는 무언가를 전달하는 방법이 있나요 다음 Date.parse (...) 또는 ISODate (...) 방법은?

해결법

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

    1.당신은 라비 Khakhkhar에서 제공하는 두 번째 링크에서 자바 스크립트를 사용하거나 당신이 (원래 형식으로 특수 문자 중 일부는 올바른 분리 문자로 인식되지 않습니다으로) 당신의 orginal 한 문자열을 변환하는 몇 가지 문자열 조작을 수행해야 할 것되지만 당신이 그렇게하면, 당신이 사용할 수있는 "새로운"

    당신은 라비 Khakhkhar에서 제공하는 두 번째 링크에서 자바 스크립트를 사용하거나 당신이 (원래 형식으로 특수 문자 중 일부는 올바른 분리 문자로 인식되지 않습니다으로) 당신의 orginal 한 문자열을 변환하는 몇 가지 문자열 조작을 수행해야 할 것되지만 당신이 그렇게하면, 당신이 사용할 수있는 "새로운"

    training:PRIMARY> Date()
    Fri Jun 08 2012 13:53:03 GMT+0100 (IST)
    training:PRIMARY> new Date()
    ISODate("2012-06-08T12:53:06.831Z")
    
    training:PRIMARY> var start = new Date("21/May/2012:16:35:33 -0400")        => doesn't work
    training:PRIMARY> start
    ISODate("0NaN-NaN-NaNTNaN:NaN:NaNZ")
    
    training:PRIMARY> var start = new Date("21 May 2012:16:35:33 -0400")        => doesn't work    
    training:PRIMARY> start
    ISODate("0NaN-NaN-NaNTNaN:NaN:NaNZ")
    
    training:PRIMARY> var start = new Date("21 May 2012 16:35:33 -0400")        => works
    training:PRIMARY> start
    ISODate("2012-05-21T20:35:33Z")
    

    여기합니다 (몽고 쉘 내에서 데이터에 대한 수정) 유용 할 몇 가지 링크입니다 -

    http://cookbook.mongodb.org/patterns/date_range/

    http://www.mongodb.org/display/DOCS/Dates

    http://www.mongodb.org/display/DOCS/Overview+-+The+MongoDB+Interactive+Shell

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

    2.내 경우에는 내가 문자열에서 날짜 형식으로 클럭 타임 모음에서 필드 ClockInTime를 변환하기위한 다음과 같은 솔루션으로 성공했다 :

    내 경우에는 내가 문자열에서 날짜 형식으로 클럭 타임 모음에서 필드 ClockInTime를 변환하기위한 다음과 같은 솔루션으로 성공했다 :

    db.ClockTime.find().forEach(function(doc) { 
        doc.ClockInTime=new Date(doc.ClockInTime);
        db.ClockTime.save(doc); 
        })
    
  3. ==============================

    3.MongoDB를 4.0 및 최신 사용

    MongoDB를 4.0 및 최신 사용

    은 $ TODATE 연산자는 날짜 값을 변환합니다. 값은 날짜, $ TODATE 오류로 변환 할 수없는 경우. 값이 null 또는 누락 된 경우, $ TODATE 반환 널 (null) :

    다음과 같이 집계 파이프 라인 내에서 사용할 수 있습니다 :

    db.collection.aggregate([
        { "$addFields": {
            "created_at": {
                "$toDate": "$created_at"
            }
        } }
    ])
    

    위는 다음과 같이 $ 변환 연산자를 사용하는 것과 같습니다 :

    db.collection.aggregate([
        { "$addFields": {
            "created_at": { 
                "$convert": { 
                    "input": "$created_at", 
                    "to": "date" 
                } 
            }
        } }
    ])
    

    MongoDB를 3.6 및 최신 사용

    또한 날짜 객체에 날짜 / 시간 문자열로 변환 잘 시간대로 날짜 형식을 지정하는 옵션이있는 $의 dateFromString 연산자를 사용 CAB :

    db.collection.aggregate([
        { "$addFields": {
            "created_at": { 
                "$dateFromString": { 
                    "dateString": "$created_at",
                    "format": "%m-%d-%Y" /* <-- option available only in version 4.0. and newer */
                } 
            }
        } }
    ])
    

    사용하여 MongoDB 버전> = 2.6 <3.2

    MongoDB의 버전은 변환을 기본 운영자가없는 경우) (foreach 문을 사용 중 하나에 의해 반복 처리를 찾기 () 메소드에 의해 반환되는 커서를 수동으로하는 방법을 필요 또는 커서 방법은 다음 () 문서에 액세스 할 수 있습니다. 루프를 withing에, ISODate 객체에 필드를 변환 한 다음 필드 created_at라고 다음 예와 같이 $ 집합 연산자를 사용하여 필드를 업데이트하고 현재 문자열 형식으로 날짜가 원하는 분야

    var cursor = db.collection.find({"created_at": {"$exists": true, "$type": 2 }}); 
    while (cursor.hasNext()) { 
        var doc = cursor.next(); 
        db.collection.update(
            {"_id" : doc._id}, 
            {"$set" : {"created_at" : new ISODate(doc.created_at)}}
        ) 
    };
    

    성능 향상을 위해 특히 당신이 당신에게 당신이에 대한 모든 요청을 전송하지 않는 한 더 나은 성능을 제공합니다 말 1000 일괄 서버로 작업을 보내는 것 같은 대량 업데이트를 대량 API를 사용하여 활용, 대규모 컬렉션을 처리 할 때 서버, 단지마다 1,000 요청한다.

    다음은 첫 번째 예 MongoDB의 버전> = 2.6 <3.2 사용할 벌크 API를 사용하여 이러한 접근법을 보여준다. 그것은 모든 업데이트 날짜 필드에 created_at 필드를 변경하여 컬렉션의 문서 :

    var bulk = db.collection.initializeUnorderedBulkOp(),
        counter = 0;
    
    db.collection.find({"created_at": {"$exists": true, "$type": 2 }}).forEach(function (doc) {
        var newDate = new ISODate(doc.created_at);
        bulk.find({ "_id": doc._id }).updateOne({ 
            "$set": { "created_at": newDate}
        });
    
        counter++;
        if (counter % 1000 == 0) {
            bulk.execute(); // Execute per 1000 operations and re-initialize every 1000 update statements
            bulk = db.collection.initializeUnorderedBulkOp();
        }
    })
    // Clean up remaining operations in queue
    if (counter % 1000 != 0) { bulk.execute(); }
    

    MongoDB를 3.2을 사용하여

    다음 예제는 이후 bulkWrite ()를 사용하는 API의 새로운 세트를 대량 API를 사용되지 않으며 제공 한 새로운 MongoDB를 버전 3.2에 적용

    var bulkOps = [],
        cursor = db.collection.find({"created_at": {"$exists": true, "$type": 2 }});
    
    cursor.forEach(function (doc) { 
        var newDate = new ISODate(doc.created_at);
        bulkOps.push(         
            { 
                "updateOne": { 
                    "filter": { "_id": doc._id } ,              
                    "update": { "$set": { "created_at": newDate } } 
                }         
            }           
        );
    
        if (bulkOps.length === 500) {
            db.collection.bulkWrite(bulkOps);
            bulkOps = [];
        }     
    });
    
    if (bulkOps.length > 0) db.collection.bulkWrite(bulkOps);
    
  4. ==============================

    4.나는 MongoDB의 일부 문자열이 MongoDB의에 적절하고 유효한 날짜 필드로 포맷되어야하는 저장했다.

    나는 MongoDB의 일부 문자열이 MongoDB의에 적절하고 유효한 날짜 필드로 포맷되어야하는 저장했다.

    여기에 특별한 날짜 형식에 대한 내 코드입니다 : "2014-03-12T09 : 14 : 19.5303017 + 01 : 00"

    하지만 당신은 쉽게 날짜 형식을 구문 분석이 아이디어를 가지고 자신의 정규식을 쓸 수 있습니다 :

    // format: "2014-03-12T09:14:19.5303017+01:00"
    var myregexp = /(....)-(..)-(..)T(..):(..):(..)\.(.+)([\+-])(..)/;
    
    db.Product.find().forEach(function(doc) { 
       var matches = myregexp.exec(doc.metadata.insertTime);
    
       if myregexp.test(doc.metadata.insertTime)) {
           var offset = matches[9] * (matches[8] == "+" ? 1 : -1);
           var hours = matches[4]-(-offset)+1
           var date = new Date(matches[1], matches[2]-1, matches[3],hours, matches[5], matches[6], matches[7] / 10000.0)
           db.Product.update({_id : doc._id}, {$set : {"metadata.insertTime" : date}})
           print("succsessfully updated");
        } else {
            print("not updated");
        }
    })
    
  5. ==============================

    5.어떻게 이런 스크립트를 작성하여 momentjs 같은 라이브러리를 사용하는 방법에 대한 :

    어떻게 이런 스크립트를 작성하여 momentjs 같은 라이브러리를 사용하는 방법에 대한 :

    [install_moment.js]
    function get_moment(){
        // shim to get UMD module to load as CommonJS
        var module = {exports:{}};
    
        /* 
        copy your favorite UMD module (i.e. moment.js) here
        */
    
        return module.exports
    }
    //load the module generator into the stored procedures: 
    db.system.js.save( {
            _id:"get_moment",
            value: get_moment,
        });
    

    다음과 같이 명령 줄에서 스크립트를로드 :

    > mongo install_moment.js
    

    마지막으로, 다음 몽고 세션에서, 그래서 같이 사용할 수 :

    // LOAD STORED PROCEDURES
    db.loadServerScripts();
    
    // GET THE MOMENT MODULE
    var moment = get_moment();
    
    // parse a date-time string
    var a = moment("23 Feb 1997 at 3:23 pm","DD MMM YYYY [at] hh:mm a");
    
    // reformat the string as you wish:
    a.format("[The] DDD['th day of] YYYY"): //"The 54'th day of 1997"
    
  6. ==============================

    6.당신은 ISO 날짜에 문자열을 날짜로 변환 $ dateFromString 집계를 사용할 수 있습니다

    당신은 ISO 날짜에 문자열을 날짜로 변환 $ dateFromString 집계를 사용할 수 있습니다

    db.collection.aggregate([
      {
        "$project": {
          "date": {
            "$dateFromString": {
              "dateString": "$date"
            }
          }
        }
      }
    ])
    
  7. from https://stackoverflow.com/questions/10942931/converting-string-to-date-in-mongodb by cc-by-sa and MIT license