Today
Total
KoreanEnglishFrenchGermanJapaneseSpanishChinese (Simplified)
관리 메뉴

DB & AWS Knowledge

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

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

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

`O` 2025. 7. 3. 02:38
728x90
반응형

이 페이지에서는 MongoDB 의 document 에 대한 CRUD 에 대하여 다룬다.

 

또한, 이 게시글은 도서 O'REILLY 사의 저서 '몽고DB 완벽가이드' 의 내용들을 심화 이해하기 위하여 작성하는 글이다.

이 페이지는 perplexity 를 통해 필자가 어떤 prompt 를 작성하여 공부하는지를 공유한다. ([] 로 표기)

또한, 검색이외에 추가로 덧붙일 내용은 ※ 로 추가한다.

 

AI 를 통해 관련된 자료를 검색하다보면 이전 게시글과 중복된 사항도 있으나 이는 복습 및 상기 차원에서 그대로 기재 되도록 한다.

 

마지막으로 이 페이지는 EC2 Amazon Linux 2023 에 설치된 기본 MongoDB 를 사용한다.

 

[MongoDB 의 InsertOne 과 InsertMany 에 대해서 알려줘]

 

MongoDB에서 InsertOneInsertMany는 컬렉션에 데이터를 삽입할 때 사용하는 대표적인 메서드입니다. 두 메서드의 차이와 특징을 아래와 같이 정리할 수 있습니다.

InsertOne

  • 설명:
    컬렉션에 단일(document 하나) 문서를 삽입할 때 사용합니다.
  • 사용법:
db.collection.insert_one({"name": "Alice", "age": 25})
  • 파라미터:
    • 삽입할 문서(딕셔너리) 1개
    • (선택) writeConcern: 데이터 쓰기 보장 수준 지정 가능
  • 반환값:
    • InsertOneResult 객체 반환
    • 삽입된 문서의 _id 값은 inserted_id 속성에 저장됨
  • 특징:
    • _id 필드를 지정하지 않으면 MongoDB가 자동으로 생성
    • 삽입 실패 시 예외 발생
    • 트랜잭션 내에서도 사용 가능12345

InsertMany

  • 설명:
    컬렉션에 여러(document 여러 개) 문서를 한 번에 삽입할 때 사용합니다.
  • 사용법:
db.collection.insert_many([ {"name": "Bob", "age": 30}, {"name": "Charlie", "age": 22} ])
  • 파라미터:
    • 삽입할 문서(딕셔너리)들의 리스트
    • (선택) writeConcern: 데이터 쓰기 보장 수준 지정 가능
    • (선택) ordered: 기본값 True. True면 순서대로 삽입, False면 일부 실패해도 나머지 계속 시도
  • 반환값:
    • InsertManyResult 객체 반환
    • 삽입된 각 문서의 _id 값은 inserted_ids 리스트에 저장됨
  • 특징:
    • 대량 삽입 시 성능이 뛰어남
    • _id 필드를 지정하지 않으면 각 문서마다 자동 생성
    • 일부 문서에서 오류 발생 시 BulkWriteError 예외 발생 가능
    • 트랜잭션 내에서도 사용 가능674

비교 표

메서드명삽입 대상반환값주요 옵션특징
insert_one 1개 문서 InsertOneResult writeConcern 단일 문서 삽입, _id 자동생성
insert_many 여러 문서 InsertManyResult writeConcern, ordered 대량 삽입, 순서 제어 가능
 

요약

  • insert_one: 한 번에 하나의 문서만 삽입, 결과로 삽입된 문서의 _id 반환
  • insert_many: 여러 문서를 한 번에 삽입, 결과로 각 문서의 _id 리스트 반환
  • 두 방법 모두 Python의 PyMongo, MongoDB Shell 등에서 동일한 원리로 사용됩니다8245.
  1. https://www.geeksforgeeks.org/mongodb/mongodb-insertone-method-db-collection-insertone/
  2. https://www.w3schools.com/python/python_mongodb_insert.asp
  3. https://dev.to/parth_barochiya/how-to-use-mongodb-insertone-for-single-document-insertion-3n02
  4. https://sparkbyexamples.com/mongodb/mongodb-insertone-insertmany-documents/
  5. https://www.w3resource.com/mongodb/mongodb-db-collection-insertone.php
  6. https://www.w3resource.com/mongodb/mongodb-db-collection-insertmany.php
  7. https://www.geeksforgeeks.org/mongodb/mongodb-insertmany-method-db-collection-insertmany/
  8. https://www.sarthaks.com/3477321/what-is-the-difference-between-insertone-and-insertmany-methods
  9. https://www.mongodb.com/docs/manual/reference/method/db.collection.insertOne/
  10. https://www.mongodb.com/ko-kr/docs/manual/reference/method/db.collection.insertOne/

 

[위의 내용과 관련하여 _id 를 임의로 넣을 때, 주의 해야 할 사항]

 

MongoDB에서 _id 필드를 임의로 지정할 때 주의해야 할 사항은 다음과 같습니다.

  1. _id는 컬렉션 내에서 반드시 고유해야 함
    • _id는 MongoDB 컬렉션의 기본 키(primary key) 역할을 하며, 같은 값이 중복되면 삽입 시 duplicate key error가 발생합니다123.
    • 따라서 애플리케이션에서 직접 값을 지정할 경우, 100% 고유한 값을 생성해야 합니다.
  2. _id 타입과 값의 일관성 유지
    • 기본적으로 MongoDB는 _id에 ObjectId 타입을 자동 생성하지만, 문자열(String), 숫자(Number) 등 다른 타입도 사용할 수 있습니다4.
    • 다만, 타입이 혼재되면 쿼리나 인덱스 성능에 영향을 줄 수 있으니 일관성 있게 사용하는 것이 좋습니다.
  3. 중복 삽입 방지
    • 동일한 _id 값으로 문서를 삽입하려 하면 오류가 발생하므로, 업데이트가 필요한 경우 insert 대신 update 또는 upsert를 사용해야 합니다5.
  4. _id를 직접 지정하는 경우의 장단점
    • 장점: 애플리케이션에서 이미 관리하는 고유 ID를 그대로 사용할 수 있어 별도의 인덱스 필드가 불필요해지고, 조회 시 효율적일 수 있음5.
    • 단점: 고유성 보장 책임이 개발자에게 있으며, 잘못 지정 시 데이터 무결성 문제가 발생할 수 있음.
  5. 샤딩 환경에서 주의점
    • _id가 샤딩 키인 경우, 기본 ObjectId는 생성 시점 기준으로 정렬되어 특정 샤드에 부하가 집중될 수 있으므로 해시 샤딩을 권장합니다4.
  6. 예외 처리 권장
    • 삽입 시 중복 _id 오류가 발생할 수 있으므로, 예외 처리를 통해 적절한 대응(예: 재시도, 업데이트 등)을 구현하는 것이 좋습니다.

요약

주의사항설명
고유성 보장 _id 값은 컬렉션 내에서 반드시 유일해야 함
타입 일관성 _id 타입은 일관되게 사용 (ObjectId, String 등)
중복 삽입 시 오류 발생 중복 _id 삽입 시 duplicate key error 발생
직접 지정 시 책임 고유성 보장과 관리 책임은 개발자에게 있음
샤딩 환경 고려 샤딩 시 해시 샤딩 권장, 기본 ObjectId는 순차적 생성
예외 처리 구현 권장 삽입 실패 시 적절한 예외 처리 및 대응 필요
  1. https://lake-yoo.tistory.com/1
  2. https://www.mongodb.com/community/forums/t/the-insert-with-id-value/173405
  3. https://www.mongodb.com/docs/manual/reference/method/db.collection.insertOne/
  4. https://www.solarwinds.com/blog/what-is-mongodbs-id-field-and-how-to-use-it
  5. https://stackoverflow.com/questions/52030967/is-it-bad-practice-to-set-my-own-mongodb-id-from-a-unique-id-of-the-document
  6. https://velog.io/@pest95/84%EC%9D%BC%EC%B0%A8-MongoDB-CRUD
  7. https://www.mongodb.com/docs/drivers/node/current/crud/pkFactory/
  8. https://www.reddit.com/r/mongodb/comments/74a346/mongdb_best_practice_with_id/
  9. https://jie0025.tistory.com/540
  10. https://www.mongodb.com/docs/manual/reference/method/db.collection.insert/

 

[위의 내용과 관련하여 MongoDB 의 삽입 유효성을 알려주고 이와 관련하여 Document 크기 제한 및 Insert 제한 크기를 알려줘]

 

MongoDB에서 데이터 삽입(insert)과 관련된 유효성(Validation), Document 크기 제한, Insert 제한에 대해 아래와 같이 정리할 수 있습니다.

1. MongoDB 삽입 유효성(Validation)

  • Schema Validation
    MongoDB는 기본적으로 유연한 스키마 구조를 가지지만, 컬렉션 단위로 **스키마 유효성 검사(Validation Rules)**를 설정할 수 있습니다.
    예를 들어, 특정 필드는 반드시 문자열이어야 하거나, 값의 범위가 정해져 있어야 하며, 필수 필드 여부도 지정할 수 있습니다.
  • 삽입 시 유효성 검사
    스키마 유효성 규칙이 설정된 경우, 문서가 해당 규칙을 위반하면 삽입(insert)이나 갱신(update)이 거부됩니다.
    기본값은 위반 시 삽입/갱신이 실패하고, 로그에 기록됩니다.
    (단, 옵션에 따라 경고만 남기고 허용할 수도 있음)12.
  • 활용 예시
    • password 필드는 반드시 문자열
    • item 필드는 특정 목록 내 값만 허용
    • gpa 필드는 양수만 허용

2. Document 크기 제한

  • 단일 Document 최대 크기
    MongoDB에서 **하나의 Document 크기는 최대 16MB(16,777,216 bytes)**입니다345.
  • 제한 이유
    단일 문서가 과도하게 커지는 것을 방지하여, 성능 저하 및 메모리/네트워크 과부하를 막기 위함입니다.
  • 16MB 초과 데이터 저장
    16MB를 초과하는 대용량 데이터(예: 이미지, 동영상 등)는 GridFS라는 별도 API를 사용해 저장해야 합니다.

3. Insert(삽입) 제한

  • insertMany의 Document 수 제한
    한 번에 insertMany로 삽입할 수 있는 Document 수는 최대 1000개입니다.
    1000개를 초과하면 내부적으로 1000개 단위로 나누어 처리합니다6.
  • 각 Document의 크기 제한
    insertMany로 여러 개를 넣더라도, 각 문서가 16MB를 넘을 수 없습니다.
    (즉, insertMany로 1000개를 넣더라도 각 문서는 16MB 이하여야 함)74.
  • 중첩(Depth) 제한
    BSON 문서의 중첩(객체/배열)은 최대 100단계까지 허용됩니다3.

4. 삽입 유효성 및 제한 관련 정리 표

항목제한/설명
단일 Document 크기 최대 16MB
insertMany 1회 최대 1000개 Document (내부적으로 자동 분할)
Document 중첩 깊이 최대 100단계
스키마 Validation 컬렉션 단위로 JSON Schema 기반 유효성 검사 가능
유효성 위반 시 기본적으로 삽입/갱신 거부, 옵션에 따라 경고만 허용 가능
16MB 초과 데이터 GridFS 사용 필요
 

참고:

  • 삽입 시 스키마 유효성 검사를 적극 활용하면 데이터 품질과 일관성을 높일 수 있습니다.
  • 대용량 데이터는 반드시 GridFS 등 별도 저장 방식을 고려해야 하며, insertMany 등 대량 삽입 시에는 개수와 크기 제한을 항상 염두에 두어야 합니다.
  1. https://www.mongodb.com/docs/manual/core/schema-validation/
  2. https://dbschema.com/blog/mongodb/data-validation-rules/
  3. https://www.mongodb.com/docs/manual/reference/limits/
  4. https://thecodebuzz.com/mongodb-document-size-guidelines-and-best-practices/
  5. https://www.mongodb.com/docs/manual/core/document/
  6. https://groups.google.com/g/mongodb-user/c/zMBdPK1fvlE
  7. https://www.mongodb.com/community/forums/t/how-does-the-data-size-limitation-work/154738
  8. https://www.xuchao.org/docs/mongodb/reference/limits.html
  9. https://stackoverflow.com/questions/12550210/how-to-apply-constraints-in-mongodb
  10. https://www.mongodb.com/docs/compass/current/validation/
  11. https://www.mongodb.com/docs/manual/core/schema-validation/specify-validation-level/
  12. https://studio3t.com/knowledge-base/articles/mongodb-schema-validation/
  13. https://stackoverflow.com/questions/12587217/mongodb-javascript-batch-insert-unique-constraint?rq=1
  14. https://www.digitalocean.com/community/tutorials/how-to-use-schema-validation-in-mongodb
  15. https://www.mongodb.com/community/forums/t/increase-max-document-size-to-at-least-64mb/124424
  16. https://velog.io/@redjen/mongodb%EC%9D%98-16mb-%EC%95%85%EB%A7%88
  17. https://stackoverflow.com/questions/4667597/understanding-mongodb-bson-document-size-limit
  18. https://stackoverflow.com/questions/36042967/mongoose-insertmany-limit
  19. https://www.reddit.com/r/mongodb/comments/h0o06x/two_questions_regarding_mongodb_limits_16mb/

 

[deleteOne 과 deleteMany 를 알려주고 이에 대한 예시를 보여줘]

 

deleteOne

  • 설명:
    지정한 조건에 일치하는 첫 번째 문서 하나만 삭제합니다.
  • 특징:
    • 조건에 맞는 문서가 여러 개여도, 오직 하나만 삭제합니다.
    • 삭제된 문서가 없으면 아무 변화도 없습니다.

예시

// age가 25인 첫 번째 문서만 삭제 db.users.deleteOne({ age: 25 })

deleteMany

  • 설명:
    지정한 조건에 일치하는 모든 문서를 삭제합니다.
  • 특징:
    • 조건에 맞는 문서가 0개면 아무 변화도 없습니다.
    • 조건에 맞는 문서가 여러 개면 모두 삭제됩니다.

예시

// age가 25인 모든 문서를 삭제 db.users.deleteMany({ age: 25 })

요약 비교

메서드명삭제 대상삭제 개수
deleteOne 조건에 맞는 첫 번째 문서 최대 1개
deleteMany 조건에 맞는 모든 문서 0개 이상
 

 

[deleteMany 로 모든 도큐먼트를 삭제하는 방법과 이와 연관지어 drop 을 같이 알려줘]

 

1. deleteMany로 모든 도큐먼트 삭제

  • 설명:
    deleteMany에 빈 조건({})을 주면 해당 컬렉션의 모든 도큐먼트가 삭제됩니다.
  • 컬렉션 구조(인덱스 등)는 그대로 남고, 데이터만 사라집니다.

예시

// users 컬렉션의 모든 도큐먼트 삭제 db.users.deleteMany({})

2. drop으로 컬렉션 자체 삭제

  • 설명:
    drop()은 컬렉션 전체(데이터 + 인덱스 등 메타데이터 포함)를 완전히 삭제합니다.
  • 컬렉션 자체가 사라지므로, 이후에는 해당 컬렉션이 존재하지 않게 됩니다.
  • 복구 불가에 유의해야 합니다.

예시

// users 컬렉션 자체를 삭제 db.users.drop()

차이점 요약

방법데이터 삭제인덱스/스키마 삭제컬렉션 존재 여부
deleteMany({}) O X O
drop() O O X
 

정리

  • deleteMany({}) : 모든 도큐먼트를 삭제하지만 컬렉션과 인덱스는 남아있음.
  • drop() : 컬렉션 전체(데이터, 인덱스, 메타데이터 포함)를 완전히 삭제.

 

728x90
반응형
Comments