# 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()
등도 있음.
더 많은 사용법은 매뉴얼을 참고하자.