AOC55

Backend, Devops, Cloud, kubernetes

BackEnd/MongoDB

MongoDB :: 기본 CRUD 사용법

aoc55.soft@gmail.com 2022. 10. 10. 22:55

시작하며

금번 회사에서 진행하는 신규 프로젝트에서 MongoDB를 사용함에 따라서, MongoDB 학습중에 정리한 사항을 남겨봅니다.

모든 내용의 기반은 아래 문헌을 참고하였습니다. 또한 아래 글의 내용 중에 틀린 내용이 있을 수 있습니다.

 

참고문헌

몽고DB 완벽가이드  | 한빛미디어 

https://product.kyobobook.co.kr/detail/S000001810370

 

 


삽입 (insert)

단일 삽입 (insertOne)

db.student.insertOne({
    "name" : "lee",
    "age" : 18   
})

 

복수 삽입 (insertMany)

입력한 순서에 대해 보장이 필요한 경우 (기본)

db.student.insertMany([
    { name: "kim1", age: 11 },
    { name: "kim2", age: 12 }
])

 

입력한 순서에 대해 보장이 필요없는 경우

db.student.insertMany([
    { name: "lee1", age: 11 },
    { name: "lee2", age: 12 },
    { name: "lee3", age: 12 }
], {"ordered" : false})
  • 추가할 대상 다음으로 {"orderd" : false} 로 옵션을 지정해준다.
  • 입력 시 순서 보장이 필요 없을 때 → MongoDB에서 알아서 효율적으로 정렬 후 삽입한다.

 

삭제 (delete)

단일 삭제(deleteOne)

db.student.deleteOne({
    "name": "alex"
})
  • 삭제 대상 식별에 필요한 파라미터(필터) 지정.

 

복수 삭제(deleteMany)

db.student.deleteMany({
    "age" : 12.0
})
  • 동일하게 삭제 대상 식별에 필요한 필터를 지정 (복수삭제)

 

Collection 초기화 (drop)

db.student.drop()
  • 주의사항으로 drop() 진행 후, 따로 복구나 drop에 대해서 취소하기 등은 제공되지 않는다.

 

 

업데이트(update)

단일치환 (replaceOne)

db.student.replaceOne({"name":"lee"}, {
    "name": "new-lee",
    "age" : 31
})
  • 첫번째 : 필터 파라미터로 대상 지정 → _id 사용해도 효과적
  • 두번째 : 치환할 Document
  • 주의사항으로 replace는 전체가 완전히 치환되는 것임.

 

  •  

숫자 필드 증가(update + $inc)

db.student.updateOne({"name":"new-lee"}, {
    "$inc" : {"age" : 1}
})
  • update 함수 내 연산자로 $inc를 사용한다.
  • → 여기서 age 값이 1 증가하게 된다.
  • 해당 연산자를 문자열에 시도 할 경우 실패가 발생한다.
  • 찾은 Document에서 설정한 필드 자체가 없을 경우 → 필드를 새로 추가해준다.

 

필드 Set (update + $set)

  • 특정 Dcoument에 특정 필드 세팅
db.student.updateOne({"name":"new-lee"}, {
    "$set" : {"hobby" : "running"}
})
  • update 함수 내 연산자로 $set을 사용한다.
  • → 여기서는 hobby를 “running”으로 Set 해준다.
  • 역시 찾은 Document에서 설정한 필드 자체가 없을 경우 → 필드를 새로 추가해준다.

 

필드 unset (update + $unset)

db.student.updateOne({"name":"new-lee"}, {
    "$unset" : {"hobby" : "XXX"}
})
  • update 함수 내 연산자로 $unset을 사용한다.
  • 특정 Document에 특정 필드에 대한 key와 value 모두 제거한다.
  • → key 자체를 삭제할 것이므로, 호출 시 key:value에서 value는 중요하지 않다.

 

내장 Document 필드 변경

db.student.updateOne({"name":"new-lee"}, {
    "$set" : {"grade.math" : 1}
})
  • 특정 Document 내의 내장 Document 의 값을 변경하고 싶을 때
  • 동일하게 update 함수 내 연산자로 $unset을 사용한다.
  • -> 대상으로 내장 Document 이름.필드명을 사용한다.
  • $inc, $set, $unset 모두 동일.

 

다중 Document 갱신 (updateMany)

db.student.updateMany({}, {
    "$set" : {"food": "kimchi"}
})
  • 기본적으로 updateOne과 매개변수 체계는 동일함.

 

반환과 갱신 같이하기 (findOneAndUpdate)

var result = db.student.findOneAndUpdate({"name" : "bbb"}, {
    "$set" : {"food" : "pizza"}
})

print(result.food)
  • 한번의 연산으로 Update 수행과 반환까지 한번에 함.
  • 그러나 반환되는 객체는 Update 수행되기 이전의 객체이다!

 

갱신 이후 반환하게 하기 (findOneAndUpdate)

var result = db.student.findOneAndUpdate(
    {"name" : "bbb"}, 
    {"$set" : {"food" : "hambuger"}},
    {"returnNewDocument" : true}
)

print(result.food)
  • returnNewDocument : true 를 통해 Update 이후 반환하도록 함

 

Upsert

  • Upsert : 미존재시 Insert하고, 존재할 경우 update를 수행

Upsert by $set

db.student.updateOne({"name":"bbb"}, 
    {"$set" : {"kkey" : "zzz"}},
    {"upsert": true}
)
  • 단순 $set 연산자 사용과는 다른 점으로,
  • 필터 파라미터와 일치하는 Document가 없다면, 아예 Document를 새로 만들어버린다.

 

Upsert By $setOnInsert

db.student.updateOne({"name":"zzz1"}, 
    {"$setOnInsert" : {"kkey" : "cvcvc"}},
    {"upsert": true}
)
  • $setOnInsert 연산자의 경우 필터에 맞는 Document가 없어서,
  • Insert 할때만을 한정해서 필드 값을 지정할 경우에만 사용한다.
  • 즉, Upsert의 Update의 경우에는 적용되지 않는다.

 

save

var x = db.student.findOne()
x.food = "kimchi"
db.student.save(x)
  • Document 미 존재시 삽입하고, 존재하면 갱신하게 해준다.
  • 실질적으로 셀에서 빠른 수정이 가능해서 사용한다.

 

 

 

'BackEnd > MongoDB' 카테고리의 다른 글

MongoDB :: Query 사용법  (0) 2022.10.22
MongoDB :: 배열 연산자 사용법  (0) 2022.10.12