DB & AWS Knowledge
MongoDB 의 data type 세부이해 본문
이 페이지에서는 아래의 이전 게시글에 이어 MongoDB 의 document 에 사용되는 data type 에 대하여 세부적으로 설명할 사항들에 대하여 설명한다.
[+] 2025.05.28 - [MongoDB, AWS DocumentDB/아키텍처 및 내부 구조] - MongoDB 의 data type
또한, 이 게시글은 도서 O'REILLY 사의 저서 '몽고DB 완벽가이드' 의 내용들을 심화 이해하기 위하여 작성하는 글이다.
이 페이지는 perplexity 를 통해 필자가 어떤 prompt 를 작성하여 공부하는지를 공유한다. ([] 로 표기)
또한, 검색이외에 추가로 덧붙일 내용은 ※ 로 추가한다.
AI 를 통해 관련된 자료를 검색하다보면 이전 게시글과 중복된 사항도 있으나 이는 복습 및 상기 차원에서 그대로 기재 되도록 한다.
또한, 이 게시글 부터는 Perplexity 에서 공유하는 출처 표기또한 동시에 표기한다.
[MongoDB 에서 Date() 와 New Date() 의 차이]
MongoDB에서 Date()와 new Date()는 서로 다른 동작을 한다.
Date() // "Wed May 28 2025 02:12:00 GMT+0900 (Korean Standard Time)"
- new Date()
new Date() // ISODate("2025-05-28T02:12:00.000Z")
정리하면,
- Date()는 문자열을 반환하고,
- new Date()는 날짜 객체(ISODate)를 반환한다.
따라서 MongoDB에서 날짜 타입 필드에 값을 저장하거나, 쿼리에서 날짜 비교를 할 때는 반드시 new Date()를 사용해야 한다. 문자열로 저장하면 날짜 연산이 불가능하므로 주의해야 한다48.
Citations:
- https://jaejade.tistory.com/165
- https://monny.tistory.com/222
- https://www.mongodb.com/ko-kr/docs/manual/reference/operator/aggregation/dateSubtract/
- https://yuby.gitbooks.io/mongodb-ko/content/the-mongo-shell/data-types-on-the-mongo-shell.html
- https://kim-zzaisang.tistory.com/32
- https://hoing.io/archives/8839
- https://velog.io/@raminicano/MongoDB-%EA%B8%B0%EB%B3%B8%EC%A0%81%EC%9D%B8-%EC%89%98-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%83%80%EC%9E%85-SQL%EA%B3%BC-%EB%B9%84%EA%B5%90
- https://www.mongodb.com/ko-kr/docs/mongodb-shell/reference/data-types/
- https://velog.io/@98kimjh/Database-MongoDB-Date-Method
[MongoDB 의 data type 중 배열에 대해서 알려줘]
MongoDB에서 배열(Array) 타입은 하나의 필드에 여러 값을 리스트 형태로 저장할 수 있는 데이터 타입이다. 배열은 대괄호 [ ]로 표현하며, 문자열, 숫자, 불리언, 도큐먼트 등 다양한 타입의 값을 혼합해서 담을 수 있다. 또한, 배열 안에 또 다른 배열이나 도큐먼트를 중첩하여 저장하는 것도 가능하다145.
예를 들어, 아래와 같이 한 사용자의 취미를 배열로 저장할 수 있다.
{
"name": "민수",
"age": 25,
"hobbies": ["독서", "영화", "요리"]
}
배열의 주요 특징은 다음과 같다.
- 하나의 필드에 여러 값을 저장할 수 있다.
- 서로 다른 데이터 타입의 값도 함께 저장할 수 있다.
- 배열 내부의 값에 대해 쿼리, 인덱싱, 정렬 등 다양한 연산이 가능하다45.
- 배열 연산자($all, $in, $elemMatch, $size, $slice 등)를 사용하여 배열 요소를 조건으로 쿼리할 수 있다7.
예시로, hobbies 배열에 "요리"가 포함된 모든 문서를 조회하려면 다음과 같이 쿼리할 수 있다.
db.users.find({ hobbies: "요리" })
db.users.find({ hobbies: { $size: 3 } })
이처럼 MongoDB의 배열 타입은 다양한 데이터를 유연하게 저장하고, 배열 내부의 값에 대해 효율적으로 쿼리할 수 있도록 지원한다457.
※ MongoDB 에서는 배열 (array) 의 요소에 대하여 query 가 가능하다. 예를들어 hobbies field 에 있는 배열 요소 query 를 통해 원하는 document 를 찾을 수 있고 이를 인덱싱에 응용 할 수 있다. 또한, 특정 요소에 대한 수정도 가능하다.
Citations:
- https://velog.io/@raminicano/MongoDB-%EA%B8%B0%EB%B3%B8%EC%A0%81%EC%9D%B8-%EC%89%98-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%83%80%EC%9E%85-SQL%EA%B3%BC-%EB%B9%84%EA%B5%90
- https://hoing.io/archives/8839
- https://colevelup.tistory.com/45
- https://devbksheen.tistory.com/entry/%EB%AA%BD%EA%B3%A0DB%EC%9D%98-%EB%8D%B0%EC%9D%B4%ED%84%B0%ED%98%95
- https://fletcher-seth.tistory.com/181
- https://blog.naver.com/v_lovepooh_v/20184823162
- https://pupbani.tistory.com/49
- http://nicewoong.github.io/development/2018/02/10/mongodb-feature/
- https://meetup.nhncloud.com/posts/275
- https://junb51.tistory.com/13
[MongoDB 내장 도큐먼트에 대해서 알려줘]
MongoDB에서 내장 도큐먼트(embedded document)는 도큐먼트의 필드 값으로 또 다른 도큐먼트(객체)를 저장하는 데이터 구조를 의미한다. 즉, 하나의 도큐먼트 안에 관련된 데이터를 중첩된 형태로 포함시킬 수 있다. 이를 통해 평면적인 키/값 쌍이 아닌, 더 자연스럽고 계층적인 데이터 구조를 만들 수 있다146.
예시를 들면, 한 사람의 정보에 주소를 포함시키고 싶을 때 다음과 같이 표현한다.
{
"name": "yoon",
"address": {
"city": "bundang",
"street": "migeum111"
}
}
여기서 "address" 필드의 값이 또 다른 도큐먼트(객체)로 들어가 있으므로, "address"는 내장 도큐먼트가 된다16.
내장 도큐먼트를 사용하는 주요 장점은 다음과 같다.
- 관련된 데이터를 하나의 도큐먼트에 묶어 저장함으로써 데이터의 관련성을 명확하게 표현할 수 있다4.
- 단일 쿼리로 관련 데이터를 한 번에 조회하거나 갱신할 수 있다.
- 도큐먼트 단위의 원자적 쓰기 연산이 가능하므로, 내장 도큐먼트 전체를 한 번에 안전하게 수정할 수 있다4.
내장 도큐먼트는 점 표기법(dot notation)을 사용해 내부 필드에 접근하거나 쿼리할 수 있다. 예를 들어, "address.city"가 "bundang"인 도큐먼트를 찾으려면 다음과 같이 쿼리할 수 있다.
db.collection.find({ "address.city": "bundang" })
이처럼 MongoDB의 내장 도큐먼트는 복잡한 구조의 데이터를 효율적으로 저장하고, 관련 데이터를 빠르게 조회하거나 수정할 수 있도록 해준다149.
※ RDBMS 에 익숙한 사용자라면 이는 address table 내용을 위와 같이 개인정보 table 에 포함시킨 것으로 이해하면 쉽다.
Citations:
- https://codinghack.tistory.com/97
- https://flambeeyoga.tistory.com/entry/MongoDB-%EB%AA%BD%EA%B3%A0-DB%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C
- https://javacpro.tistory.com/66
- https://blog.naver.com/oidoman/221230255258
- https://secretartbook.tistory.com/4
- https://dodote10.tistory.com/627
- https://velog.io/@hanblueblue/%EB%B2%88%EC%97%AD-MongoDB-1-Introduction-to-MongoDB-BSON-Documents-Databases-and-Collections
- https://jessyt.tistory.com/114
- https://www.mongodb.com/ko-kr/docs/manual/core/document/
- https://blog.naver.com/zerosum99/120175147926
[MongoDB 의 ObjectId 및 이에 대한 중요성에 대해서 알려줘]
MongoDB의 ObjectId는 각 도큐먼트의 고유 식별자로 사용되는 12바이트 크기의 값이다. RDBMS의 Primary Key와 유사한 역할을 하며, MongoDB에서는 도큐먼트를 저장할 때 _id 필드에 ObjectId가 자동으로 부여된다. 사용자가 직접 _id 값을 지정하지 않는 한, MongoDB가 ObjectId를 생성하여 고유성을 보장한다258.
ObjectId의 구조는 다음과 같다.
- 첫 4바이트: Unix epoch(1970년 1월 1일) 이후 초 단위의 타임스탬프 값이다. 이를 통해 ObjectId가 생성된 시점을 알 수 있다.
- 다음 5바이트: 머신 ID와 프로세스 ID를 조합한 값으로, 같은 시간에 여러 서버와 프로세스에서 ObjectId를 생성해도 충돌하지 않도록 한다.
- 마지막 3바이트: 증가하는 카운터 값으로, 같은 머신과 프로세스에서 같은 초에 여러 ObjectId가 생성될 때 중복을 방지한다1346.
ObjectId의 중요성은 다음과 같다.
- 고유성 보장: 분산 환경에서 여러 서버와 프로세스가 동시에 데이터를 처리하더라도 ObjectId의 구조 덕분에 충돌 없이 고유한 값을 생성할 수 있다. 이는 MongoDB가 분산 데이터베이스로 설계된 이유와 맞닿아 있다17.
- 자동 생성 및 편의성: 사용자가 직접 관리하지 않아도 MongoDB가 자동으로 ObjectId를 생성해주므로, 데이터 삽입 시 편리하다258.
- 생성 시간 정보 포함: ObjectId에는 생성 시점의 타임스탬프가 포함되어 있어, 데이터의 생성 시기를 쉽게 파악할 수 있다36.
- 성능 및 확장성: ObjectId는 클라이언트 측에서 생성할 수 있으므로, 데이터베이스 서버에 부하를 주지 않고 빠르게 고유 식별자를 할당할 수 있다. 이는 분산 시스템에서 데이터 삽입 성능과 확장성을 높인다147.
이처럼 ObjectId는 MongoDB에서 데이터의 고유성, 분산 환경에서의 확장성, 데이터 생성 시간 추적 등 여러 면에서 핵심적인 역할을 한다.
Citations:
- https://monday9pm.com/mongodb%EC%9D%98-objectid%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC-801e9f5ea479
- https://kim-jong-hyun.tistory.com/95
- https://blog.eomsh.com/201
- https://blog.seulgi.kim/2014/09/mongodb-objectid.html
- https://yoonveloping.tistory.com/22
- https://velog.io/@rudwnd33/TIL-10%EC%9B%94-16%EC%9D%BC
- https://ssddo-story.tistory.com/47
- https://grini25.tistory.com/217
- https://www.mongodb.com/ko-kr/docs/manual/reference/method/ObjectId/
- https://weights-learn-develop.tistory.com/64
- https://velog.io/@moonyoung/mongoDB-ObjectID-with-golang
[MongoDB 에서 프로세스당 제한되는 ObjectId 개수를 알려줘]
MongoDB에서 프로세스당 제한되는 ObjectId의 개수는 1초에 약 16,777,216개(16M개)다. ObjectId는 12바이트로 구성되며, 이 중 3바이트(24비트)가 카운터로 사용되는데, 이 카운터가 1초 동안 프로세스 내에서 생성할 수 있는 ObjectId의 최대 개수를 결정한다. 즉, 한 프로세스가 1초에 생성할 수 있는 ObjectId의 최대치는 16,777,216개다4.
이 제한은 ObjectId의 구조상 결정되는 값이며, 일반적인 애플리케이션에서는 사실상 무제한에 가깝게 사용할 수 있다.
Citations:
- https://www.mongodb.com/ko-kr/docs/manual/reference/method/ObjectId/
- https://velog.io/@raminicano/MongoDB-%EC%9A%A9%EC%96%B4%EC%99%80-%EB%8D%B0%EC%9D%B4%ED%84%B0%EC%B2%98%EB%A6%AC
- https://www.mongodb.com/ko-kr/docs/manual/reference/limits/
- https://devbksheen.tistory.com/entry/%EB%AA%BD%EA%B3%A0DB%EC%9D%98-%EB%8D%B0%EC%9D%B4%ED%84%B0%ED%98%95
- https://thalals.tistory.com/177
- https://blog.spiralmoon.dev/entry/MongoDB-%EA%B3%84%EC%A0%95%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-DB-%EA%B6%8C%ED%95%9C-%EC%A0%9C%EC%96%B4%ED%95%98%EA%B8%B0
- https://freeend.tistory.com/101
- https://www.mongodb.com/ko-kr/docs/v6.0/reference/method/ObjectId/
- https://gamguma.dev/post/2022/04/mongodb_schema_design
'MongoDB, AWS DocumentDB > 아키텍처 및 내부 구조' 카테고리의 다른 글
MongoDB document 관련 기본 조작 (CRUD) - 1 (0) | 2025.07.03 |
---|---|
MongoDB shell 사용방법 및 관련 명령어 - 2 (0) | 2025.06.17 |
MongoDB 의 data type (0) | 2025.05.28 |
AWS EC2 를 통한 Document DB 접속방법 및 간단한 테스트 (0) | 2025.05.23 |
Database, Collection, Document, Field, _id 추가 이해 (0) | 2025.05.19 |