크리스티나 초도로 , 섀넌 브래드쇼 , 오언 브라질 님의 "몽고DB 완벽 가이드" 책을 정리한 포스팅 입니다.
1. 도큐먼트 삽입
insertOne() | insertMany() | |
기능 | 단일 도큐먼트 삽입 | 다수 도큐먼트 일괄 삽입 |
특징 | insertedId 반환 → 성공 여부 및 생성된 _id 확인 가능 |
크기 제한 - 48MB (maxMessageSizeBytes) 제한 크기 초과 시 자동 분할 삽입 |
옵션 | - bypassDocumentValidation: 유효성 검사 비활성화 - writeConcern: 쓰기 신뢰성 |
- bypassDocumentValidation, writeConcern - ordered: 삽입 중 에러 시 중단 여부 |
예시) 옵션
더보기
더보기
bypassDocumentValidation
// age는 유효성 검사 설정이 된 필드 (0 이상이여야 함)
db.collection.insertMany(
[{ name: "Noah", age: -10 }],
{ bypassDocumentValidation: true }
)
- 유효성 검사가 발생하지 않음
writeConcern
db.collection.insertMany(
[{ name: "Mia" }],
{ writeConcern: { w: "majority", wtimeout: 5000 } }
)
항목 | 의미 |
w: "majority" |
과반수 노드(replica set의 과반수)가 이 쓰기를 확인(ack) 해야 성공으로 인정
|
wtimeout: 5000 |
과반수 응답을 기다리는 최대 시간을 5초(5000ms) 로 설정.
5초 안에 과반수 응답 못 받으면 타임아웃 에러 발생 |
ordered
db.temp.insertMany([
{_id: 1, "name": "Alice"},
{_id: 1, "name": "Alice2"},
{_id: 2, "name": "Alice2"},
{_id: 3, "name": "Alice3"},
], { ordered: true})
⬇️ ⬇️ ⬇️ ⬇️ ⬇️
{
_id: 1,
name: 'Alice'
}
db.temp.insertMany([
{_id: 1, "name": "Alice"},
{_id: 1, "name": "Alice2"},
{_id: 2, "name": "Alice2"},
{_id: 3, "name": "Alice3"},
], { ordered: false})
⬇️ ⬇️ ⬇️ ⬇️ ⬇️
{
_id: 1,
name: 'Alice'
}
{
_id: 2,
name: 'Alice2'
}
{
_id: 3,
name: 'Alice3'
}
설정 | 동작 |
ordered: true (기본) | 중간에 에러 나면 즉시 중단 |
ordered: false |
에러 무시하고 계속 삽입 진행
|
_id 필드
- 기본적으로 자동으로 추가함
- 명시적으로 대입 가능
유효성 검사
- 인코딩 타입 체크 (드라이버 옵션)
- 도큐먼트 크기 제한: 16MB 이하 (maxBsonObjectSize)
2. 도큐먼트 삭제
메서드 | 설명 |
deleteOne() | 조건에 맞는 첫 번째 도큐먼트 삭제 |
deleteMany() | 조건에 맞는 모든 도큐먼트 삭제 |
drop() | 컬렉션 자체 삭제 |
필터링
- 첫번째 매개변수에 삭제할 도큐먼트를 필터링할 수 있음
- 필터링할 컬럼은 여러개 지정할 수 있음
예시
3. 도큐먼트 갱신
- 갱신은 원자적으로 이루어짐
- ➡️ 동시 발생 시, 먼저 도착한 요청이 적용된 후 다음 요청이 적용됨
메서드 | 설명 |
replaceOne() | 하나의 도큐먼트를 교체 (일치하는 조건의 첫 번째 도큐먼트만 교체) |
updateOne() | 하나의 도큐먼트 업데이트 (일치하는 조건의 첫 번째 도큐먼트만 업데이트) |
updateMany() | 여러 도큐먼트 업데이트 (조건에 맞는 모든 도큐먼트를 업데이트) |
예제) replaceOne()
갱신 연산자
- updateOne()과 updateMany()는 갱신 연산자 및 갱신 입력이 필요함
종류 | 연산자 | 설명 |
갱신
|
$set | 특정 필드 갱신 (없으면 추가) |
$unset | 필드 삭제 | |
$inc | 수치값 증가 | |
배열
|
$push | 배열에 요소 추가 |
$ |
배열 위치 연산자 (특정 위치를 지정하여 갱신)
|
|
arrayFilters | 배열의 특정 조건을 만족하는 요소만 갱신 | |
집합
|
$addToSet | 배열에 요소 추가 (중복 없음. 집합처럼 동작) |
$pop | 배열의 첫 번째 또는 마지막 요소 제거 | |
$pull | 배열에서 조건에 맞는 요소 제거 | |
부등호 | $ne |
배열 내 요소가 특정 값이 아닌 경우 조회 (not equal)
|
예제
더보기
더보기
$set
db.pageviews.updateOne({"url":"www.example.com"}, {"$set" : {"favorite": true}})
$unset
db.pageviews.updateOne({"url":"www.example.com"}, {"$unset" : {"favorite": true}})
$inc
db.pageviews.updateOne({"url":"www.example.com"}, {"$inc" : {"pageviews": 1}})
$push
db.pageviews.updateOne({"url":"www.example.com"}, {"$push" : {"languages": "javascript"}})
# $each: 여러개 push 가능
db.pageviews.updateOne({"url":"www.example.com"}, {"$push" : {"languages": {"$each": ["java", "typescript"]}}})
# $slice: 배열의 총 길이 제한
# $sort: 내부 도큐먼트의 정렬 기준 (1: ASC, -1: DESC)
db.pageviews.updateOne({"url":"www.example.com"}, {"$push" : {
"dependencies": {
"$each": [
{"name": "spring data jpa", "version": 3},
{"name": "websocket", "version": 5},
{"name": "redis", "version": 4}],
"$slice": -3,
"$sort": {"version": 1}}
}
})
$
db.pageviews.updateOne({"comments.author": "John"}, {"$inc": {"comments.$.votes": 1}})
db.pageviews.updateOne({"comments.author": "John"}, {"$set": {"comments.$.author": "Jim"}})
arrayFilters
db.pageviews.updateOne({"url": "www.example.com"}, {"$set": {"comments.$[comment].author": "Noah"}}, {"arrayFilters": [{"comment.votes": {"$lte": 3}}]})
$addToSet
db.pageviews.updateOne({"url":"www.example.com"}, {"$addToSet" : {"languages": "java8"}})
db.pageviews.updateOne({"url":"www.example.com"}, {"$addToSet" : {"languages": {"$each": ["java8", "java9", "java11"]}}})
$pop
db.pageviews.updateOne({"url":"www.example.com"}, {"$pop" : {"languages": 1}}) # 맨 뒤에서 제거
db.pageviews.updateOne({"url":"www.example.com"}, {"$pop" : {"languages": -1}}) # 맨 앞에서 제거
$pull
db.pageviews.updateOne({ "url": "www.example.com" }, { "$pull": { "languages": "java8" } })
$ne
db.pageviews.find({"url":{"$ne": "www.example.kr"}})
갱신 입력 (upsert)
- 갱신 조건에 맞는 도큐먼트가 존재하지 않을 경우, 조건에 해당되는 도큐먼트를 자동 생성
예제
더보기
upsert
db.pageviews.updateOne({"url": "www.example.kr"}, {"$inc": {"pageviews": 1}}, {"upsert": true})
$setOnInsert
db.pageviews.updateOne({"url": "www.example.org"}, {"$inc": {"pageviews": 1}, "$setOnInsert": {"createdAt": new Date()}}, {upsert: true})
- 자동 생성될 때, 설정할 필드 지정
'Database > MongoDB' 카테고리의 다른 글
[몽고DB 완벽 가이드] 6. 특수 인덱스와 컬렉션 유형 (0) | 2025.04.30 |
---|---|
[몽고DB 완벽 가이드] 5. 인덱싱 (0) | 2025.04.29 |
[몽고DB 완벽 가이드] 4. 쿼리 (1) | 2025.04.28 |
[몽고DB 완벽 가이드] 2. 몽고DB 기본 (1) | 2025.04.27 |
[몽고DB 완벽 가이드] 1. 몽고DB 소개 (0) | 2025.04.27 |