# MongoDB 간략 정리

TIP

구 블로그에 남겨둔 기록을 옮겨왔다.

MySQL만 쓰다가 MongoDB를 사용해보니.. 익숙치는 않지만 개인 프로젝트 용도로는 훨씬 현실적인 선택이 될것 같다. 개발 단계별로 DB의 스키마 맞추는 것도 일인데... 그럴 필요가 없으니.

# 버전별 특징

  • 1.x: 초기버젼. Global Lock등 성능 문제.
  • 2.4: JS엔진 교체(SpiderMonkey -> V8)
  • 2.6: DB Level Lock
  • 3.0: Wired Tiger Engine 도입, 기본엔진은 Collection Level Lock, WT엔진은 Document(Row) Level Lock
  • 3.2: 기본엔진이 WT로 변경

# RDBMS <-> MongoDB 개념 비교

  • DB <-> DB
  • Table <-> Collection
  • Row(Record) <-> Document
  • Column <-> Field

# 포인트

  • 따로 테이블 생성같은 단계는 필요 없다.
  • _id를 지정하지 않으면 자동으로 생성.
  • _id는 기본으로 인덱스 적용
  • 삽입
    • db.collection.insertOne({json obj}): 리턴은 _id 포함.
    • db.collection.insertMany([{json obj}]): 리턴은 _id 배열 포함.
    • db.collection.insert({json obj}): 객체 또는 배열 입력, 리턴은 벌크 결과.
  • 조회
    • db.collection.find({query filter}, {projection})
    • db.users.find({ status: { $in: [ "P", "D" ] } })
    • $or: 유사함. equality check 안함.
    • db.users.find({ status: "A", age: { $lt: 30 } })
    • db.users.find({ $or: [ { status: "A" }, { age: { $lt: 30 } } ] })
    • db.users.find({ status: "A" }, {name: 1, status: true })
  • 갱신
    • db.collection.updateOne({condition}, {set})
    • db.users.updateOne({ "fav.art": "picasso" }, { $set: { "fav.food": "pie" }, $currentDate: { lastModified: true } })
    • db.collection.updateMany(): updateOne과 동일
    • db.collection.update()
    • db.users.update({ "fav.art": "picasso" }, { $set: { "fav.food": "pie" }, $currentDate: { lastModified: true } }, { multi: true })
    • db.collection.replaceOne(): _id 제외하고 모두 교체
    • db.users.replaceOne({ name: "abc" }, { name: "amy", age: 34, ... })
  • 삭제
    • db.collection.remove()
    • db.users.remove({ status: "A" }, true): true는 justOne 필드임.
    • db.collection.deleteOne()
    • db.collection.deleteMany()
    • db.users.deleteMany({ status: "A" })
  • 기타로
    • findAndModify()
    • fineOneAndUpdate() 등도 있음.

더 많은 사용법은 매뉴얼을 참고하자.

The MongoDB Manual (opens new window)

최종 수정: 2021-1-7 15:25:10