Today
Total
KoreanEnglishFrenchGermanJapaneseSpanishChinese (Simplified)
관리 메뉴

DB & AWS Knowledge

MongoDB document 관련 기본 조작 (CRUD) - 2 본문

MongoDB, AWS DocumentDB/아키텍처 및 내부 구조

MongoDB document 관련 기본 조작 (CRUD) - 2

`O` 2025. 7. 4. 02:54
728x90
반응형

이 페이지에서는 이전 게시글에 이어 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인 모든 도큐먼트 수정
 
  • $set 연산자를 사용하지 않으면, 해당 도큐먼트 전체가 덮어써질 수 있으니 주의해야 합니다12.

2. RDBMS의 UPDATE와의 차이점

구분MongoDB (NoSQL)RDBMS (MySQL, Oracle 등)
데이터 구조 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.

  1. https://progdev.tistory.com/43
  2. https://dkkim2318.tistory.com/130
  3. https://adjh54.tistory.com/257
  4. https://www.mongodb.com/ko-kr/docs/manual/reference/method/db.collection.updatemany/
  5. https://fletcher-seth.tistory.com/182
  6. https://www.mongodb.com/ko-kr/docs/manual/reference/method/db.collection.updateOne/
  7. 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
  8. 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
  9. 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
  10. 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"
  }
)
  • 주의:
    • replaceOne은 해당 문서를 완전히 새 문서로 교체하므로, _id 필드를 반드시 포함해야 합니다.
    • 기존에 있던 다른 필드(예: city)도 새 문서에 명시적으로 포함해야 삭제되지 않습니다123.

활용 팁

  • 여러 문서에 대해 반복적으로 구조를 바꿔야 한다면, 애플리케이션 코드(Python, Node.js 등)에서 기존 문서를 읽어 새 구조로 변환한 뒤 replaceOne을 반복 호출하는 방식이 일반적입니다.
  • 부분 수정만 원한다면 $set을 사용하는 updateOne/updateMany가 더 적합합니다.

요약:
replaceOne은 문서 전체를 새 구조로 대체하므로, 기존 필드를 서브도큐먼트로 옮기려면 새 문서에 원하는 구조를 직접 만들어서 사용해야 합니다.
이때 _id와 유지할 모든 필드를 반드시 포함해야 데이터 손실이 없습니다123.

  1. https://www.mongodb.com/ko-kr/docs/manual/reference/method/db.collection.replaceone/
  2. https://www.geeksforgeeks.org/mongodb-replace-documents-using-mongoshell/
  3. https://www.prisma.io/dataguide/mongodb/managing-documents
  4. https://afsdzvcx123.tistory.com/entry/MongoDB-%EB%8F%84%ED%81%90%EB%A8%BC%ED%8A%B8-%EA%B0%B1%EC%8B%A0
  5. 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
  6. https://www.mongodb.com/ko-kr/docs/drivers/java/sync/v4.9/usage-examples/replaceOne/
  7. 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
  8. https://kfdd6630.tistory.com/entry/MongoDB-Update%EA%B4%80%EB%A0%A8-%EC%B0%A8%EC%9D%B4%EC%A0%90
  9. https://dotnettutorials.net/lesson/replace-document-in-mongodb/
  10. 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)
  • 에러 메시지 예시:
  •  
    text
    E11000 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 등 예외 처리를 반드시 구현해야 합니다.

 

728x90
반응형
Comments