Docs Menu
Docs Home
/
MongoDB 매뉴얼
/

BSON 유형

이 페이지의 내용

  • 이진 데이터
  • ObjectId
  • 문자열
  • 타임스탬프
  • 날짜

BSON은 MongoDB에서 문서를 저장하고 원격 절차 호출을 수행하는 데 사용되는 바이너리 직렬화 형식입니다. BSON 사양은 bsonspec.org에서 확인할 수 있습니다.

각 BSON types에는 다음 표에 나열된 정수 및 문자열 식별자가 모두 있습니다.

유형
번호
별명
참고 사항
Double
1
"double"
문자열
2
"문자열"
객체
3
"객체"
배열
4
"배열"
이진 데이터
5
"binData"
정의되지 않음
6
"정의되지 않음"
더 이상 사용되지 않습니다.
ObjectId
7
"objectId"
부울
8
"bool"
날짜
9
'날짜'
Null
10
"null"
정규 표현식
11
"정규식"
DB포인터
12
"dbPointer"
더 이상 사용되지 않습니다.
JavaScript
13
"javascript"
기호
14
"기호"
더 이상 사용되지 않습니다.
32비트 정수
16
"in"
타임스탬프
17
"타임스탬프"
64비트 정수
18
"long"
Decimal128
19
"십진수"
Min key
-1
" 밍키 "
최대 키
127
"최대 키"

필드의 유형을 확인하려면 유형 검사를참조하세요.

BSON을 JSON으로 변환하는 경우 확장 JSON 참조를 참조하세요.

다음 섹션에서는 특정 BSON types을 위한 특별한 고려 사항을 설명합니다.

BSON 바이너리 binData 값은 바이트 배열입니다. binData 값에는 이진 데이터를 해석하는 방법을 나타내는 하위 유형이 있습니다. 다음 표에는 하위 유형이 나와 있습니다.

번호
설명
0
일반 바이너리 하위 유형
1
함수 데이터
2
바이너리(이전)
3
UUID(이전)
4
UUID
5
MD5
6
암호화된 BSON 값
7

압축된 Time Series 데이터

버전 5.2에 추가되었습니다.

8
키나 시크릿과 같은 민감한 데이터. MongoDB는 하위 유형이 8인 바이너리 데이터에 대한 리터럴 값을 기록하지 않습니다. 대신 자리 표시자 값 ### 을 기록합니다.
9
벡터 데이터는 동일한 유형의 숫자가 밀집되어 있는 배열입니다.
128
사용자 지정 데이터

ObjectId는 작고, 고유할 가능성이 높으며, 생성 속도가 빠르고, 정렬되어 있습니다. ObjectId 값의 길이는 12바이트이며, 다음으로 구성됩니다.

  • Unix epoch 이후 초 단위로 측정된 ObjectId 생성을 나타내는 4바이트 타임스탬프입니다.

  • 프로세스당 한 번씩 생성되는 임의의 5바이트 값입니다. 이 임의의 값은 머신과 프로세스마다 고유합니다.

  • 임의의 값으로 초기화되는 3바이트 증분 카운터입니다.

타임스탬프 및 카운터 값의 경우 가장 중요한 바이트가 바이트 시퀀스 (빅 엔디안) 에서 가장 먼저 나타납니다. 이는 최하위 바이트가 먼저 나타나는(리틀 엔디안) 다른 BSON 값과 다릅니다.

ObjectId를 생성하는 데 정수 값이 사용되는 경우 정수가 타임스탬프를 대체합니다.

MongoDB에서 컬렉션에 저장된 각 문서에는 기본 키 역할을 하는 고유한 _id 필드가 필요합니다. 삽입된 문서에서 _id 필드가 생략된 경우, MongoDB 드라이버는 _id 필드에 대한 ObjectId를 자동으로 생성합니다.

이는 upsert: true를 사용하여 업데이트 작업을 통해 삽입된 문서에도 적용됩니다.

MongoDB 클라이언트는 고유한 ObjectId를 가진 _id 필드를 추가해야 합니다. _id 필드에 객체 ID를 사용하면 다음과 같은 추가 이점이 있습니다.

  • mongosh에서 ObjectId.getTimestamp() 메서드를 사용하여 ObjectId 생성 시간을 액세스할 수 있습니다.

  • ObjectId는 생성 시간에 따라 대략적으로 정렬되지만 완벽하게 정렬되지는 않습니다. ObjectId 값을 포함하는 _id 필드에서 컬렉션을 정렬하는 것은 생성 시간을 기준으로 정렬하는 것과 거의 동일합니다.

    중요

    ObjectId 값은 시간이 지남에 따라 증가해야 하지만 반드시 단조적이지는 않습니다. 그 이유는 다음과 같습니다.

    • 1초의 임시 확인만 포함하므로 동일한 초 내에 생성된 ObjectId 값은 순서가 보장되지 않습니다.

    • 클라이언트에서 생성되며, 시스템 클럭이 다를 수 있습니다.

ObjectId 값을 설정하고 검색하려면 ObjectId() 메서드를 사용하세요.

MongoDB 5.0부터는 mongosh가 레거시 mongo 셸을 대체합니다. ObjectId() 메서드는 mongosh에서 레거시 mongo 셸과 다르게 작동합니다. 레거시 메서드에 대한 자세한 내용은 레거시 Mongo 셸을 참조하세요.

BSON 문자열은 UTF-8입니다. 일반적으로 각 프로그래밍 언어의 드라이버는 BSON을 직렬화 및 역직렬화할 때 해당 언어의 문자열 형식에서 UTF-8로 변환합니다. 이를 통해 대부분의 국제 문자를 BSON 문자열에 쉽게 저장할 수 있습니다. [1] 또한 MongoDB $regex 쿼리는 정규식 문자열에서 UTF-8을 지원합니다.

[1] UTF-8 문자를 사용하는 문자열이 주어지면 문자열에 sort() 를 사용하는 것이 합리적으로 정확합니다. 그러나 내부적으로 sort() 은(는) C++ strcmp API를 사용하기 때문에 정렬 순서가 일부 문자를 잘못 처리할 수 있습니다.

BSON에는 내부 MongoDB 사용을 위한 특수 타임스탬프 유형이 있으며 일반 Date 유형과는 관련이 없습니다 . 이 내부 타임스탬프 유형은 64 비트 값입니다.

  • 가장 중요한 32비트는 time_t 값입니다(Unix epoch 이후의 초 수).

  • 가장 중요하지 않은 32비트는 지정된 초 내의 작업에 대한 증분 ordinal입니다.

BSON 형식은 리틀 엔디안이므로 최하위 비트를 먼저 저장하지만, mongod 인스턴스는 엔디안 여부에 관계없이 모든 플랫폼에서 항상 time_t 값을 ordinal 값보다 먼저 비교합니다.

단일 mongod 인스턴스 내에서 타임스탬프 값은 항상 고유합니다.

복제에서 oplog에는 ts 필드가 있습니다. 이 필드의 값은 BSON 타임스탬프 값을 사용하는 작업 시간을 반영합니다.

참고

BSON 타임스탬프 유형은 내부 MongoDB 사용을 위한 것입니다. 대부분의 경우 애플리케이션 개발에서는 BSON 날짜 유형을 사용하게 됩니다. 자세한 내용은 날짜를 참조하세요.

MongoDB는 빈 타임스탬프 값이 있는 최상위 필드를 포함하는 문서를 삽입할 때 다음을 제외하고 빈 타임스탬프 값을 현재 타임스탬프 값으로 대체합니다. _id 필드 자체에 빈 타임스탬프 값이 포함되어 있으면 항상 있는 그대로 삽입되고, 대체되지 않습니다.

예시

빈 타임스탬프 값이 있는 문서를 삽입

db.test.insertOne( { ts: new Timestamp() } );

db.test.find()를 실행하면 다음과 유사한 문서가 반환됩니다.

{ "_id" : ObjectId("542c2b97bac0595474108b48"), "ts" : Timestamp(1412180887, 1) }

서버가 ts의 빈 타임스탬프 값을 삽입 시점의 타임스탬프 값으로 대체했습니다.

BSON Date는 Unix epoch(1970년 1월 1일) 이후의 밀리초 수를 나타내는 64비트 정수입니다. 그 결과 과거와 미래까지 약 2억 9천만년의 표현 가능한 날짜 범위가 생성됩니다.

공식 BSON 사양에서는 BSON Date 유형을 UTC datetime으로 나타냅니다.

BSON 날짜 유형이 서명되어 있습니다. [2] 음수 값은 1970년 이전의 날짜를 나타냅니다.

예시

mongosh에서 new Date() 생성자를 사용하여 날짜를 생성합니다.

var mydate1 = new Date()

예시

mongosh에서 ISODate() 생성자를 사용하여 날짜를 생성합니다.

var mydate2 = ISODate()

예시

날짜 값을 문자열로 반환

mydate1.toString()

예시

날짜 값의 월 부분을 반환합니다. 달은 인덱스가 0이므로 1월은 0 달입니다.

mydate1.getMonth()
[2] 버전 2.0 이전에는 Date 값이 부호가 없는 정수로 잘못 해석되어 Date 필드의 정렬, 범위 쿼리 및 인덱스에 영향을 미쳤습니다. 업그레이드 시 인덱스가 다시 생성되지 않으므로 이전 버전에서 Date 값에 인덱스를 생성했고, 사용자의 애플리케이션이 1970년 이전의 날짜와 관련되어 경우 인덱스를 다시 생성하세요.

돌아가기

Query API