programing

mongodb에서 문자열을 날짜로 변환하는 중

telebox 2023. 5. 12. 22:03
반응형

mongodb에서 문자열을 날짜로 변환하는 중

mongodb 쉘을 사용하여 사용자 지정 형식을 사용하여 문자열을 현재 날짜로 변환하는 방법이 있습니까?

"21/5/2012:16:35:33-0400"을 현재까지 변환하려고 합니다.

지나갈 수 있는 방법이 있습니까?DateFormatter아니면 무엇인가.Date.parse(...)또는ISODate(....)방법?

MongoDB 4.0 이상 사용

연산자가 값을 날짜로 변환합니다.값을 날짜로 변환할 수 없으면 오류가 발생합니다.값이 null이거나 누락된 경우 null을 반환합니다.

다음과 같이 Aggregate 파이프라인 내에서 사용할 수 있습니다.

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

위는 연산자를 다음과 같이 사용하는 것과 같습니다.

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

MongoDB 3.6 이상 사용

또한 날짜/시간 문자열을 날짜 개체로 변환하고 날짜 형식과 시간대를 지정하는 옵션이 있는 연산자를 사용할 수 있습니다.

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 and < 3.2

MongoDB 버전에 변환을 수행하는 기본 연산자가 없는 경우, 문서에 액세스하기 위해 메서드 또는 커서 메서드를 사용하여 메서드에서 반환된 커서를 수동으로 반복해야 합니다.루프를 사용하여 필드를 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)}}
    ) 
};

특히 대규모 수집을 처리할 때 성능을 향상시키려면 대량 업데이트에 Bulk API를 사용하십시오. 작업을 1000개 단위로 서버에 보낼 수 있으므로 모든 요청을 1000개마다 한 번씩만 서버에 보내는 것이 아니므로 성능이 향상됩니다.

다음은 이 접근 방식을 보여줍니다. 첫 번째 예에서는 MongoDB 버전에서 사용할 수 있는 Bulk API를 사용합니다.>= 2.6 and < 3.2변경하여 컬렉션의 모든 문서를 업데이트합니다.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 사용

다음 예제는 새 MongoDB 버전에 적용됩니다.3.2이 회사는 이후 대량 API를 사용하지 않고 다음을 사용하여 최신 아피스 세트를 제공했습니다.

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);

이 경우 ClockInTime 필드를 ClockTime 컬렉션에서 문자열에서 Date 유형으로 변환하는 다음 솔루션을 사용했습니다.

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

Ravi Khakhar에서 제공하는 두 번째 링크에서 Javascript를 사용하거나 원래 문자열을 변환하기 위해 문자열 조작을 수행해야 합니다(원래 형식의 일부 특수 문자가 유효한 delimeter로 인식되지 않기 때문에). 하지만 그렇게 하면 "새"를 사용할 수 있습니다.

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

MongoDB Stored에 mongodb의 적절하고 유효한 dateTime 필드로 재구성해야 하는 문자열이 있습니다.

다음은 특별한 날짜 형식에 대한 내 코드입니다: "2014-03-12T09:14:19.53017+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");
    }
})

다음과 같은 스크립트를 작성하여 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"

는 $toDate 연산자를 updateMany와 함께 사용하는 것이 가장 쉽다고 생각합니다.

db.collection.updateMany({}, [{$set: {createdAt: {$toDate: "$createdAt"}}}]);

언급URL : https://stackoverflow.com/questions/10942931/converting-string-to-date-in-mongodb

반응형