Today
Total
KoreanEnglishFrenchGermanJapaneseSpanishChinese (Simplified)
관리 메뉴

DB & AWS Knowledge

MongoDB 의 data type 세부이해 본문

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

MongoDB 의 data type 세부이해

`O` 2025. 5. 30. 02:30
728x90
반응형

이 페이지에서는 아래의 이전 게시글에 이어 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()
    • 현재 날짜와 시간을 문자열(String) 형태로 반환한다.
    • 이 결과는 단순한 텍스트이므로, 날짜 연산이나 비교에는 사용할 수 없다48.
Date() // "Wed May 28 2025 02:12:00 GMT+0900 (Korean Standard Time)"

 

  • new Date()
    • 현재 날짜와 시간을 Date 객체로 반환한다.
    • MongoDB에서는 이 객체가 ISODate로 감싸져 저장된다.
    • 이 객체는 날짜 타입 필드에 저장하거나, 날짜 연산 및 비교에 사용할 수 있다4678.
new Date() // ISODate("2025-05-28T02:12:00.000Z")

 

정리하면,

  • Date()는 문자열을 반환하고,
  • new Date()는 날짜 객체(ISODate)를 반환한다.

따라서 MongoDB에서 날짜 타입 필드에 값을 저장하거나, 쿼리에서 날짜 비교를 할 때는 반드시 new Date()를 사용해야 한다. 문자열로 저장하면 날짜 연산이 불가능하므로 주의해야 한다48.

Citations:

  1. https://jaejade.tistory.com/165
  2. https://monny.tistory.com/222
  3. https://www.mongodb.com/ko-kr/docs/manual/reference/operator/aggregation/dateSubtract/
  4. https://yuby.gitbooks.io/mongodb-ko/content/the-mongo-shell/data-types-on-the-mongo-shell.html
  5. https://kim-zzaisang.tistory.com/32
  6. https://hoing.io/archives/8839
  7. 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
  8. https://www.mongodb.com/ko-kr/docs/mongodb-shell/reference/data-types/
  9. 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: "요리" })
 
 
배열의 크기가 3인 문서를 찾으려면 다음과 같이 쓸 수 있다.
 
db.users.find({ hobbies: { $size: 3 } })
 
 

이처럼 MongoDB의 배열 타입은 다양한 데이터를 유연하게 저장하고, 배열 내부의 값에 대해 효율적으로 쿼리할 수 있도록 지원한다457.

 

MongoDB 에서는 배열 (array) 의 요소에 대하여 query 가 가능하다. 예를들어 hobbies field 에 있는 배열 요소 query 를 통해 원하는 document 를 찾을 수 있고 이를 인덱싱에 응용 할 수 있다. 또한, 특정 요소에 대한 수정도 가능하다.

Citations:

  1. 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
  2. https://hoing.io/archives/8839
  3. https://colevelup.tistory.com/45
  4. 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
  5. https://fletcher-seth.tistory.com/181
  6. https://blog.naver.com/v_lovepooh_v/20184823162
  7. https://pupbani.tistory.com/49
  8. http://nicewoong.github.io/development/2018/02/10/mongodb-feature/
  9. https://meetup.nhncloud.com/posts/275
  10. 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:

  1. https://codinghack.tistory.com/97
  2. 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
  3. https://javacpro.tistory.com/66
  4. https://blog.naver.com/oidoman/221230255258
  5. https://secretartbook.tistory.com/4
  6. https://dodote10.tistory.com/627
  7. https://velog.io/@hanblueblue/%EB%B2%88%EC%97%AD-MongoDB-1-Introduction-to-MongoDB-BSON-Documents-Databases-and-Collections
  8. https://jessyt.tistory.com/114
  9. https://www.mongodb.com/ko-kr/docs/manual/core/document/
  10. 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:

  1. https://monday9pm.com/mongodb%EC%9D%98-objectid%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC-801e9f5ea479
  2. https://kim-jong-hyun.tistory.com/95
  3. https://blog.eomsh.com/201
  4. https://blog.seulgi.kim/2014/09/mongodb-objectid.html
  5. https://yoonveloping.tistory.com/22
  6. https://velog.io/@rudwnd33/TIL-10%EC%9B%94-16%EC%9D%BC
  7. https://ssddo-story.tistory.com/47
  8. https://grini25.tistory.com/217
  9. https://www.mongodb.com/ko-kr/docs/manual/reference/method/ObjectId/
  10. https://weights-learn-develop.tistory.com/64
  11. 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:

  1. https://www.mongodb.com/ko-kr/docs/manual/reference/method/ObjectId/
  2. 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
  3. https://www.mongodb.com/ko-kr/docs/manual/reference/limits/
  4. 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
  5. https://thalals.tistory.com/177
  6. 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
  7. https://freeend.tistory.com/101
  8. https://www.mongodb.com/ko-kr/docs/v6.0/reference/method/ObjectId/
  9. https://gamguma.dev/post/2022/04/mongodb_schema_design

 

 

 

728x90
반응형
Comments