DB & AWS Knowledge
MongoDB document 관련 기본 조작 (CRUD) - 1 본문
728x90
반응형
이 페이지에서는 MongoDB 의 document 에 대한 CRUD 에 대하여 다룬다.
또한, 이 게시글은 도서 O'REILLY 사의 저서 '몽고DB 완벽가이드' 의 내용들을 심화 이해하기 위하여 작성하는 글이다.
이 페이지는 perplexity 를 통해 필자가 어떤 prompt 를 작성하여 공부하는지를 공유한다. ([] 로 표기)
또한, 검색이외에 추가로 덧붙일 내용은 ※ 로 추가한다.
AI 를 통해 관련된 자료를 검색하다보면 이전 게시글과 중복된 사항도 있으나 이는 복습 및 상기 차원에서 그대로 기재 되도록 한다.
마지막으로 이 페이지는 EC2 Amazon Linux 2023 에 설치된 기본 MongoDB 를 사용한다.
[MongoDB 의 InsertOne 과 InsertMany 에 대해서 알려줘]
MongoDB에서 InsertOne과 InsertMany는 컬렉션에 데이터를 삽입할 때 사용하는 대표적인 메서드입니다. 두 메서드의 차이와 특징을 아래와 같이 정리할 수 있습니다.
InsertOne
- 설명:
컬렉션에 단일(document 하나) 문서를 삽입할 때 사용합니다. - 사용법:
db.collection.insert_one({"name": "Alice", "age": 25})
- 파라미터:
- 삽입할 문서(딕셔너리) 1개
- (선택) writeConcern: 데이터 쓰기 보장 수준 지정 가능
- 반환값:
- InsertOneResult 객체 반환
- 삽입된 문서의 _id 값은 inserted_id 속성에 저장됨
- 특징:
InsertMany
- 설명:
컬렉션에 여러(document 여러 개) 문서를 한 번에 삽입할 때 사용합니다. - 사용법:
db.collection.insert_many([ {"name": "Bob", "age": 30}, {"name": "Charlie", "age": 22} ])
- 파라미터:
- 삽입할 문서(딕셔너리)들의 리스트
- (선택) writeConcern: 데이터 쓰기 보장 수준 지정 가능
- (선택) ordered: 기본값 True. True면 순서대로 삽입, False면 일부 실패해도 나머지 계속 시도
- 반환값:
- InsertManyResult 객체 반환
- 삽입된 각 문서의 _id 값은 inserted_ids 리스트에 저장됨
- 특징:
비교 표
메서드명삽입 대상반환값주요 옵션특징
insert_one | 1개 문서 | InsertOneResult | writeConcern | 단일 문서 삽입, _id 자동생성 |
insert_many | 여러 문서 | InsertManyResult | writeConcern, ordered | 대량 삽입, 순서 제어 가능 |
요약
- https://www.geeksforgeeks.org/mongodb/mongodb-insertone-method-db-collection-insertone/
- https://www.w3schools.com/python/python_mongodb_insert.asp
- https://dev.to/parth_barochiya/how-to-use-mongodb-insertone-for-single-document-insertion-3n02
- https://sparkbyexamples.com/mongodb/mongodb-insertone-insertmany-documents/
- https://www.w3resource.com/mongodb/mongodb-db-collection-insertone.php
- https://www.w3resource.com/mongodb/mongodb-db-collection-insertmany.php
- https://www.geeksforgeeks.org/mongodb/mongodb-insertmany-method-db-collection-insertmany/
- https://www.sarthaks.com/3477321/what-is-the-difference-between-insertone-and-insertmany-methods
- https://www.mongodb.com/docs/manual/reference/method/db.collection.insertOne/
- https://www.mongodb.com/ko-kr/docs/manual/reference/method/db.collection.insertOne/
[위의 내용과 관련하여 _id 를 임의로 넣을 때, 주의 해야 할 사항]
MongoDB에서 _id 필드를 임의로 지정할 때 주의해야 할 사항은 다음과 같습니다.
- _id는 컬렉션 내에서 반드시 고유해야 함
- _id 타입과 값의 일관성 유지
- 기본적으로 MongoDB는 _id에 ObjectId 타입을 자동 생성하지만, 문자열(String), 숫자(Number) 등 다른 타입도 사용할 수 있습니다4.
- 다만, 타입이 혼재되면 쿼리나 인덱스 성능에 영향을 줄 수 있으니 일관성 있게 사용하는 것이 좋습니다.
- 중복 삽입 방지
- 동일한 _id 값으로 문서를 삽입하려 하면 오류가 발생하므로, 업데이트가 필요한 경우 insert 대신 update 또는 upsert를 사용해야 합니다5.
- _id를 직접 지정하는 경우의 장단점
- 장점: 애플리케이션에서 이미 관리하는 고유 ID를 그대로 사용할 수 있어 별도의 인덱스 필드가 불필요해지고, 조회 시 효율적일 수 있음5.
- 단점: 고유성 보장 책임이 개발자에게 있으며, 잘못 지정 시 데이터 무결성 문제가 발생할 수 있음.
- 샤딩 환경에서 주의점
- _id가 샤딩 키인 경우, 기본 ObjectId는 생성 시점 기준으로 정렬되어 특정 샤드에 부하가 집중될 수 있으므로 해시 샤딩을 권장합니다4.
- 예외 처리 권장
- 삽입 시 중복 _id 오류가 발생할 수 있으므로, 예외 처리를 통해 적절한 대응(예: 재시도, 업데이트 등)을 구현하는 것이 좋습니다.
요약
주의사항설명
고유성 보장 | _id 값은 컬렉션 내에서 반드시 유일해야 함 |
타입 일관성 | _id 타입은 일관되게 사용 (ObjectId, String 등) |
중복 삽입 시 오류 발생 | 중복 _id 삽입 시 duplicate key error 발생 |
직접 지정 시 책임 | 고유성 보장과 관리 책임은 개발자에게 있음 |
샤딩 환경 고려 | 샤딩 시 해시 샤딩 권장, 기본 ObjectId는 순차적 생성 |
예외 처리 구현 권장 | 삽입 실패 시 적절한 예외 처리 및 대응 필요 |
- https://lake-yoo.tistory.com/1
- https://www.mongodb.com/community/forums/t/the-insert-with-id-value/173405
- https://www.mongodb.com/docs/manual/reference/method/db.collection.insertOne/
- https://www.solarwinds.com/blog/what-is-mongodbs-id-field-and-how-to-use-it
- https://stackoverflow.com/questions/52030967/is-it-bad-practice-to-set-my-own-mongodb-id-from-a-unique-id-of-the-document
- https://velog.io/@pest95/84%EC%9D%BC%EC%B0%A8-MongoDB-CRUD
- https://www.mongodb.com/docs/drivers/node/current/crud/pkFactory/
- https://www.reddit.com/r/mongodb/comments/74a346/mongdb_best_practice_with_id/
- https://jie0025.tistory.com/540
- 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 등 대량 삽입 시에는 개수와 크기 제한을 항상 염두에 두어야 합니다.
- https://www.mongodb.com/docs/manual/core/schema-validation/
- https://dbschema.com/blog/mongodb/data-validation-rules/
- https://www.mongodb.com/docs/manual/reference/limits/
- https://thecodebuzz.com/mongodb-document-size-guidelines-and-best-practices/
- https://www.mongodb.com/docs/manual/core/document/
- https://groups.google.com/g/mongodb-user/c/zMBdPK1fvlE
- https://www.mongodb.com/community/forums/t/how-does-the-data-size-limitation-work/154738
- https://www.xuchao.org/docs/mongodb/reference/limits.html
- https://stackoverflow.com/questions/12550210/how-to-apply-constraints-in-mongodb
- https://www.mongodb.com/docs/compass/current/validation/
- https://www.mongodb.com/docs/manual/core/schema-validation/specify-validation-level/
- https://studio3t.com/knowledge-base/articles/mongodb-schema-validation/
- https://stackoverflow.com/questions/12587217/mongodb-javascript-batch-insert-unique-constraint?rq=1
- https://www.digitalocean.com/community/tutorials/how-to-use-schema-validation-in-mongodb
- https://www.mongodb.com/community/forums/t/increase-max-document-size-to-at-least-64mb/124424
- https://velog.io/@redjen/mongodb%EC%9D%98-16mb-%EC%95%85%EB%A7%88
- https://stackoverflow.com/questions/4667597/understanding-mongodb-bson-document-size-limit
- https://stackoverflow.com/questions/36042967/mongoose-insertmany-limit
- 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
반응형
'MongoDB, AWS DocumentDB > 아키텍처 및 내부 구조' 카테고리의 다른 글
MongoDB document 관련 기본 조작 (CRUD) - 2 (0) | 2025.07.04 |
---|---|
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 |
Comments