반응형
이번에 신규 기능을 개발하면서 라이브서버 반영 시 기존 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 }
)
728x90
'DATABASE' 카테고리의 다른 글
[mongodb]node.js에서 mongodb 사용 with mongoose (0) | 2023.01.27 |
---|---|
[mongodb] 데이터베이스 생성 및 기본 명령어 (0) | 2023.01.08 |
[mongodb] mac에서 mongodb설치 (0) | 2023.01.08 |
[mysql8.0] 툴로 접속 시 127.0.0.1(localhost) Connection failed 해결 (0) | 2022.12.24 |
[postgresql] ubuntu에 postgresql 설치 방법 및 기본 사용 예시 (0) | 2022.11.18 |
댓글