크리스티나 초도로 , 섀넌 브래드쇼 , 오언 브라질 님의 "몽고DB 완벽 가이드" 책을 정리한 포스팅 입니다.
1. 도큐먼트 삽입
- 단일 삽입과 일괄 삽입 API 제공
insertOne() | insertMany() | |
기능 | 한 번에 도큐먼트 한 개 삽입 | 여러 도큐먼트 한 번에 삽입 |
특징 | 삽입 결과로 insertedId 반환 → 성공 여부와 생성된 _id 확인 가능 |
전체 데이터 크기 제한 - 48MB (maxMessageSizeBytes) - 초과 시 자동 분할 삽입 시도 |
옵션 | - bypassDocumentValidation: 유효성 검사 유무 - writeConcern: 쓰기 신뢰성 (write acknowledgment) |
- bypassDocumentValidation: 유효성 검사 유무 - writeConcern: 쓰기 신뢰성 (write acknowledgment) - ordered: 순서대로 삽입 |
예시) 옵션
더보기
ordered
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'
}
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'
}
설정 | 동작 |
ordered: true (기본) | 중간에 에러 나면 즉시 중단 |
ordered: false |
에러 무시하고 계속 삽입 진행
|
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초 안에 과반수 응답 못 받으면 타임아웃 에러 발생 |
_id 필드
- 명시적으로 정의 가능
- 존재하지 않으면 자동으로 추가함
유효성 검사
- 컬렉선의 validator
- 도큐먼트 크기 제한: 16MB 이하 (maxBsonObjectSize)
- 인코딩 타입 체크 (드라이버 옵션)
2. 도큐먼트 삭제
- 단일 삭제와 일괄 삭제 API 제공
필터링
- 첫번째 매개변수에 삭제할 도큐먼트를 필터링할 수 있음
- 필터링할 컬럼은 여러개 지정할 수 있음
예시
더보기
db.temp.deleteOne({"name": "Alice"})
db.temp.deleteMany({"name": "Alice"})
전체 삭제
- drop()
예시
더보기
db.temp.drop()
3. 도큐먼트 갱신
- 갱신은 원자적으로 이루어짐
- ➡️ 동시 발생 시, 먼저 도착한 요청이 적용된 후 다음 요청이 적용됨
연산
메서드 | 설명 | upsert 옵션 |
replaceOne() | 하나의 도큐먼트를 교체 (일치하는 조건의 첫 번째 도큐먼트만 교체) |
조건에 맞는 도큐먼트가 없으면 새 도큐먼트를 삽입 |
updateOne() | 하나의 도큐먼트 업데이트 (일치하는 조건의 첫 번째 도큐먼트만 업데이트) |
조건에 맞는 도큐먼트가 없으면 새 도큐먼트를 삽입 |
updateMany() | 여러 도큐먼트 업데이트 (조건에 맞는 모든 도큐먼트를 업데이트) |
조건에 맞는 도큐먼트가 없으면 새 도큐먼트를 삽입
|
예제) replaceOne()
더보기
db.temp.replaceOne({"name":"joe"}, joe)
- 컬렉션의 특정 도큐먼트를 JSON 객체와 치환하기
- updateOne()과 updateMany()는 갱신 연산자 및 갱신 입력이 필요함
갱신 연산자
종류 | 연산자 | 설명 |
도큐먼트 일부 갱신
|
$set | 특정 필드를 갱신하거나 새로 추가 |
$unset | 필드 삭제 | |
$inc | 수치값을 증가시킴 | |
배열
|
$push | 배열에 요소 추가 |
$ |
배열 내 특정 위치를 지정하여 갱신하는 연산자 (위치 연산자)
|
|
arrayFilters | 배열의 특정 조건을 만족하는 요소만 갱신 | |
집합
|
$addToSet | 배열에 중복 없이 요소 추가 (집합처럼 동작) |
$pop | 배열의 첫 번째 또는 마지막 요소 제거 | |
$pull | 배열에서 조건에 맞는 요소 제거 | |
부등호 | $ne |
배열 내 요소가 특정 값이 아닌 경우 조회 (not equal)
|
예제
더보기
$inc
db.pageviews.updateOne({"url":"www.example.com"}, {"$inc" : {"pageviews": 1}})
$set
db.pageviews.updateOne({"url":"www.example.com"}, {"$set" : {"favorite": true}})
$unset
db.pageviews.updateOne({"url":"www.example.com"}, {"$unset" : {"favorite": true}})
$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}}
}
})
$ne
db.pageviews.find({"url":{"$ne": "www.example.kr"}})
$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" } })
$
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}}]})
갱신 입력
upsert
- 갱신 조건에 맞는 도큐먼트가 존재하지 않을 경우, 조건에 해당되는 도큐먼트를 자동 생성
- $setOnInsert: 자동 생성될 때, 설정할 필드 지정
예제
더보기
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 |