본문 바로가기
DATABASE

[mongodb] 마이그레이션 스크립트 작성 with bulkWrite

by 하이바네 2023. 4. 5.
반응형

이번에 신규 기능을 개발하면서 라이브서버 반영 시 기존 collection에 있는 데이터를 일부 가공해서 신규 collection에 넣어야 하는 일이 생겼다.

 

이런 경우 mongodb에서 돌리면 바로 가능한 스크립트를 작성해놓으면 된다.

 

일단 간단히 느낀점은 자바스크립트나 일반적인 다른 프로그래밍 언어에 익숙하다면 금방 작성 가능할 것이다.

 

var, let, const를 사용해서 쿼리 실행 결과를 저장도 가능하고 map, forEach, for 같은 반복문도 사용 가능하다.

 

내가 작성했던 스크립트는 아래와 같다. collection 이름이랑 일부만 좀 바꿔서 코드를 올렸다.

 

아래처럼 코드를 작성해서 실행하면 migDataArr에 담긴 데이터를 bulkWrite하여 한번에 insert하게 된다.

 

const migDataArr = [];

//병원별 years 데이터 가져오기(현재 휴가 사용중인곳만)
db.old_collection.aggregate([
    {
        $group:{
            _id: "$COMPANY_CODE"  
        }
    },
    {
        $project:{
            _id:0,
            code:"$_id"
        }
    }
]).map(function(cCode){
    const companyCode = cCode.code
    const yearsCursor = db.old_collection.aggregate([
        {
            $match: {
                'COMPANY_CODE': companyCode
            }
        },
        {
            $group: {
                '_id': {
                    'YEAR': '$YEAR'
                }
            }
        },
        {
            $project: {
                '_id': 0,
                'YEAR': '$_id.YEAR',
                'USE_YN': 'Y'
            }
        },
        {
            $sort: {
                'YEAR': -1
            }
        }
    ]);

    //신규 collection인 staff_vacation_year_mgmts에 데이터 넣기
    const yearsArr = yearsCursor.toArray()
    const migData = {
        "COMPANY_CODE": companyCode,
        "ANNUAL_CREATE_TYPE": "1",
        "YEARS": yearsArr
    }
    
    migDataArr.push({
        "insertOne":{
            "document":migData
        }
    })
    
})

db.new_collection.bulkWrite(migDataArr)

 

bulkWrite에서 사용 가능한 것은 insertOne외에 다음과 같은게 있다.

db.collection.bulkWrite(
   [
      { insertOne : <document> },
      { updateOne : <document> },
      { updateMany : <document> },
      { replaceOne : <document> },
      { deleteOne : <document> },
      { deleteMany : <document> }
   ],
   { ordered : false }
)

 

 

db.collection.bulkWrite() — MongoDB Manual

Docs Home → MongoDB Manual db.collection.bulkWrite()mongosh MethodThis page documents a mongosh method. This is not the documentation for a language-specific driver, such as Node.js.For MongoDB API drivers, refer to the language-specific MongoDB driver d

www.mongodb.com

 

728x90

댓글