DB & AWS Knowledge
MongoDB document 관련 기본 조작 (CRUD) - 2 본문
이 페이지에서는 이전 게시글에 이어 MongoDB 의 document 에 대한 CRUD 에 대하여 계속 다룬다.
[+] 2025.07.03 - [MongoDB, AWS DocumentDB/아키텍처 및 내부 구조] - MongoDB document 관련 기본 조작 (CRUD) - 1
또한, 이 게시글은 도서 O'REILLY 사의 저서 '몽고DB 완벽가이드' 의 내용들을 심화 이해하기 위하여 작성하는 글이다.
이 페이지는 perplexity 를 통해 필자가 어떤 prompt 를 작성하여 공부하는지를 공유한다. ([] 로 표기)
또한, 검색이외에 추가로 덧붙일 내용은 ※ 로 추가한다.
AI 를 통해 관련된 자료를 검색하다보면 이전 게시글과 중복된 사항도 있으나 이는 복습 및 상기 차원에서 그대로 기재 되도록 한다.
마지막으로 이 페이지는 EC2 Amazon Linux 2023 에 설치된 기본 MongoDB 를 사용한다.
[updateOne 와 updateMany 에 대해서 알려주고 RDBMS 의 update 와의 차이점을 알려줘]
1. updateOne과 updateMany란?
updateOne
- 설명:
조건에 일치하는 첫 번째 도큐먼트 하나만 수정합니다. - 형식:
db.collection.updateOne(조건, {$set: {수정할필드: 값}})
- 특징:
- 조건에 맞는 여러 도큐먼트가 있어도 가장 먼저 찾은 한 개만 수정
- 반환값: 수정된 도큐먼트 수, 매칭된 도큐먼트 수 등
updateMany
- 설명:
조건에 일치하는 모든 도큐먼트를 한 번에 수정합니다. - 형식:
db.collection.updateMany(조건, {$set: {수정할필드: 값}})
- 특징:
- 조건에 맞는 모든 도큐먼트가 동시에 수정
- 반환값: 수정된 도큐먼트 수, 매칭된 도큐먼트 수 등
예시
updateOne | db.users.updateOne({age: 20}, {$set: {city: "Seoul"}}) | age가 20인 첫 번째 도큐먼트만 수정 |
updateMany | db.users.updateMany({age: 20}, {$set: {city: "Seoul"}}) | age가 20인 모든 도큐먼트 수정 |
2. RDBMS의 UPDATE와의 차이점
데이터 구조 | Document 기반 (JSON/BSON) | Table(Row/Column) 기반 |
updateOne | 조건에 맞는 첫 도큐먼트 1개만 수정 | WHERE 조건에 맞는 Row 1개만 수정 |
updateMany | 조건에 맞는 모든 도큐먼트 수정 | WHERE 조건에 맞는 모든 Row 수정 |
기본 동작 | $set 등 연산자 필요, 아니면 전체 도큐먼트 덮어씀 | SET 구문으로 컬럼 값만 수정 |
트랜잭션/무결성 | 기본적으로 약함 (ACID 보장 약함, 옵션에 따라 다름) | ACID(원자성, 일관성, 고립성, 지속성) 강함 |
스키마 | 유연(스키마 없음/동적) | 엄격(스키마 고정) |
대량 수정 | updateMany로 한 번에 처리 | UPDATE ... WHERE ... |
주요 차이점 요약
- 연산자 사용:
MongoDB는 $set, $inc 등 연산자를 반드시 사용해야 부분 수정이 가능하며, 그렇지 않으면 전체 도큐먼트가 덮어써집니다.
RDBMS는 SET 구문으로 컬럼만 수정합니다12. - 트랜잭션/무결성:
RDBMS는 트랜잭션과 데이터 무결성 보장이 강력하지만, MongoDB는 기본적으로 약하며 옵션에 따라 다릅니다3. - 스키마 유연성:
MongoDB는 스키마가 유연해 필드 추가/삭제가 자유롭지만, RDBMS는 스키마가 고정되어 있습니다. - 대량 처리:
MongoDB의 updateMany, RDBMS의 UPDATE ... WHERE ... 모두 대량 수정이 가능하지만, MongoDB는 JSON 기반 문서 전체를 다루는 점이 다릅니다.
3. 정리
- updateOne: 조건에 맞는 첫 도큐먼트 1개만 수정
- updateMany: 조건에 맞는 모든 도큐먼트 수정
- RDBMS UPDATE와의 차이:
연산자 사용 방식, 트랜잭션/무결성, 스키마 유연성 등에서 차이가 있음
MongoDB의 update 계열 명령은 RDBMS와 유사하지만, 문서 지향적 구조와 연산자 사용 방식, 트랜잭션 특성 등에서 중요한 차이가 있으니 실무 적용 시 반드시 주의해야 합니다123.
- https://progdev.tistory.com/43
- https://dkkim2318.tistory.com/130
- https://adjh54.tistory.com/257
- https://www.mongodb.com/ko-kr/docs/manual/reference/method/db.collection.updatemany/
- https://fletcher-seth.tistory.com/182
- https://www.mongodb.com/ko-kr/docs/manual/reference/method/db.collection.updateOne/
- https://translate.google.com/translate?u=https%3A%2F%2Fwww.quora.com%2FWhat-is-the-difference-between-update-updateOne-and-updateMany-in-MongoDB&sl=en&tl=ko&client=srp
- https://bamtory29.tistory.com/entry/MongoDB-update%EC%99%80-%EA%B8%B0%EC%A1%B4-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%88%98%EC%A0%95%ED%95%98%EA%B8%B0
- https://velog.io/@woo94/Update%EB%A5%BC-%ED%95%98%EB%8A%94-4%EA%B0%80%EC%A7%80-%EB%B0%A9%EB%B2%95
- https://mozi.tistory.com/626
※ MongoDB 는 RDBMS 보다 update 무결성이 약한 편이지만, 순서대로 들어오는 update 구문을 순차적으로 처리함으로써 가능한 ACID 를 보장하려고 한다.
[replaceOne 을 통해 document 에 있는 기존 필드를 서브도큐먼트로 옮기는 예시를 보여줘]
MongoDB의 replaceOne은 문서 전체를 새 문서로 완전히 대체하는 명령입니다. 기존 필드를 서브도큐먼트로 옮기려면, 원하는 구조로 새 문서를 만들어서 replaceOne의 두 번째 인자로 전달해야 합니다.
예시 상황
기존 문서
{
"_id": ObjectId("..."),
"name": "Alice",
"age": 30,
"city": "Seoul"
}
목표 구조
name, age를 profile이라는 서브도큐먼트로 이동
{
"_id": ObjectId("..."),
"profile": {
"name": "Alice",
"age": 30
},
"city": "Seoul"
}
replaceOne 사용 예시
db.users.replaceOne(
{ _id: ObjectId("...") }, // 대상 문서 조건
{
_id: ObjectId("..."),
profile: {
name: "Alice",
age: 30
},
city: "Seoul"
}
)
- 주의:
활용 팁
- 여러 문서에 대해 반복적으로 구조를 바꿔야 한다면, 애플리케이션 코드(Python, Node.js 등)에서 기존 문서를 읽어 새 구조로 변환한 뒤 replaceOne을 반복 호출하는 방식이 일반적입니다.
- 부분 수정만 원한다면 $set을 사용하는 updateOne/updateMany가 더 적합합니다.
요약:
replaceOne은 문서 전체를 새 구조로 대체하므로, 기존 필드를 서브도큐먼트로 옮기려면 새 문서에 원하는 구조를 직접 만들어서 사용해야 합니다.
이때 _id와 유지할 모든 필드를 반드시 포함해야 데이터 손실이 없습니다123.
- https://www.mongodb.com/ko-kr/docs/manual/reference/method/db.collection.replaceone/
- https://www.geeksforgeeks.org/mongodb-replace-documents-using-mongoshell/
- https://www.prisma.io/dataguide/mongodb/managing-documents
- https://afsdzvcx123.tistory.com/entry/MongoDB-%EB%8F%84%ED%81%90%EB%A8%BC%ED%8A%B8-%EA%B0%B1%EC%8B%A0
- https://inpa.tistory.com/entry/MONGO-%F0%9F%93%9A-%EB%AA%BD%EA%B3%A0%EB%94%94%EB%B9%84-%EC%BF%BC%EB%A6%AC-%EC%A0%95%EB%A6%AC
- https://www.mongodb.com/ko-kr/docs/drivers/java/sync/v4.9/usage-examples/replaceOne/
- https://programmingtilseungho.tistory.com/entry/MongoDB-%EC%BB%AC%EB%A0%89%EC%85%98%EC%97%90%EC%84%9C-field-%EC%9D%B4%EB%A6%84-%EB%B3%80%EA%B2%BD-%EC%83%88%EB%A1%9C%EC%9A%B4-field-%EC%B6%94%EA%B0%80-%EA%B8%B0%EC%A1%B4-field-%EC%82%AD%EC%A0%9C%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95
- https://kfdd6630.tistory.com/entry/MongoDB-Update%EA%B4%80%EB%A0%A8-%EC%B0%A8%EC%9D%B4%EC%A0%90
- https://dotnettutorials.net/lesson/replace-document-in-mongodb/
- https://stackoverflow.com/questions/22588236/how-to-add-an-extra-field-in-a-sub-document-in-mongodb
※ 위에도 기술되었지만 RDBMS update 와는 다르게 set, $set 의 차이가 있으므로 상황에 따라 맞는 명령어를 쓰는게 좋다.
[updateOne 시 _id 가 아닌 다른 필드 중복으로 에러가 발생 할 수 있는 예시를 알려줘]
MongoDB에서 updateOne을 사용할 때, _id가 아닌 다른 필드에 대해 unique 인덱스가 설정되어 있다면, 해당 필드 값이 중복될 경우 에러가 발생할 수 있습니다.
예시 상황
1. unique 인덱스가 설정된 컬렉션
예를 들어, email 필드에 unique 인덱스가 설정된 users 컬렉션이 있다고 가정합니다.
db.users.createIndex({ email: 1 }, { unique: true })
2. 기존 데이터
[
{ "_id": 1, "name": "Alice", "email": "alice@example.com" },
{ "_id": 2, "name": "Bob", "email": "bob@example.com" }
]
3. updateOne으로 중복 시도
아래와 같이 Bob의 이메일을 Alice와 동일하게 변경하려고 하면:
E11000 duplicate key error collection: test.users index: email_1 dup key: { email: "alice@example.com" }
4. 발생하는 에러
- DuplicateKeyError (E11000 duplicate key error)
- 에러 메시지 예시:
-
textE11000 duplicate key error collection: test.users index: email_1 dup key: { email: "alice@example.com" }
요약
- unique 인덱스가 걸린 필드에 대해 updateOne으로 중복 값을 넣으려 하면,
_id와 무관하게 중복 키 에러가 발생합니다. - 이 에러는 데이터 무결성을 보장하기 위한 MongoDB의 동작입니다.
_id 중복 | 항상 에러 발생 (기본키 충돌) |
unique 인덱스 필드 중복 | DuplicateKeyError 발생 (중복 키 인덱스 충돌) |
실무에서는 unique 인덱스가 걸린 필드의 중복 여부를 사전에 체크하거나, try-catch 등 예외 처리를 반드시 구현해야 합니다.
'MongoDB, AWS DocumentDB > 아키텍처 및 내부 구조' 카테고리의 다른 글
MongoDB document 관련 기본 조작 (CRUD) - 1 (0) | 2025.07.03 |
---|---|
MongoDB shell 사용방법 및 관련 명령어 - 2 (0) | 2025.06.17 |
MongoDB 의 data type 세부이해 (0) | 2025.05.30 |
MongoDB 의 data type (0) | 2025.05.28 |
AWS EC2 를 통한 Document DB 접속방법 및 간단한 테스트 (0) | 2025.05.23 |