BSON 유형
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 | "최대 키" |
$type
연산자는 이러한 값을 사용하여 BSON types로 필드를 쿼리할 수 있게 지원합니다.$type
은 또한 정수, 십진수, double 및 긴 BSON types와 일치하는number
별칭을 지원합니다.$type
집계 연산자는 BSON types의 인수를 반환합니다.$isNumber
애그리게이션 연산자는 인수가 BSON 정수, 십진수, 이중 또는 긴 값인 경우true
를 반환합니다.
필드의 유형을 확인하려면 유형 검사를참조하세요.
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는 작고, 고유할 가능성이 높으며, 생성 속도가 빠르고, 정렬되어 있습니다. 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 값을 설정하고 검색하려면 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년 이전의 날짜와 관련되어 경우 인덱스를 다시 생성하세요. |