데이터 유형
이 페이지의 내용
MongoDB는 JSON에서 사용할 수 없는 추가 데이터 유형을 지원하는 BSON을 사용하여 데이터를 저장합니다. mongosh
셸은 기존 mongo
셸보다 드라이버에 대한 데이터 유형 지원이 더 뛰어납니다.
이 문서에서는 mongosh
와 레거시 mongo
셸 간의 유형 사용 변경 사항을 중점적으로 설명합니다. 지원되는 유형에 대한 추가 정보는 확장 JSON 참조를 확인하세요.
날짜
mongosh
은(는) 날짜를 문자열 또는 Date
객체로 반환하는 다양한 메서드를 제공합니다.
Date()
메서드는 현재 날짜를 문자열로 반환합니다.new Date()
생성자는ISODate()
래퍼(wrapper)를 사용하여Date
객체를 반환합니다.ISODate()
생성자는ISODate()
래퍼(wrapper)를 사용하여Date
객체를 반환합니다.
ObjectId
mongosh
은(는) ObjectId 데이터 유형에 대한
ObjectId()
래퍼(wrapper) 클래스를 제공합니다. 새 ObjectId를 생성하려면 mongosh
에서 다음 작업을 사용합니다.
new ObjectId
1.8.0부터 ObjectId
래퍼(wrapper)는 더 이상 다음을 허용하지 않습니다.
ObjectId.prototype.generate
ObjectId.prototype.getInc
ObjectId.prototype.get_inc
ObjectId.getInc
다음도 참조하세요.
Double
double double() 생성자를 사용하여 double을 명시적으로 지정할 수 있습니다.double
db.types.insertOne( { "_id": 2, "value": Double(1), "expectedType": "Double" } )
참고
필드 값이 32비트 정수로 변환할 수 있는 숫자인 경우 mongosh
는 이를 Int32
로 저장합니다. 그렇지 않은 경우 mongosh
는 기본적으로 숫자를 Double
로 저장합니다. 값 유형을 지정하려면 Double()
또는 Int32()
생성자를 사용합니다.
Int32
Int32() 생성자를 사용하여 32비트 정수를 명시적으로 지정할 수 있습니다.
db.types.insertOne( { "_id": 1, "value": Int32(1), "expectedType": "Int32" } )
경고
mongosh
와 레거시 mongo
셸을 모두 이용하여 동일한 컬렉션에 연결하는 경우 기본 Int32
및 Double
유형이 일관적이지 않은 방식으로 저장될 수 있습니다.
Long
Long() 생성자를 사용하여 64비트 정수를 명시적으로 지정할 수 있습니다.
db.types.insertOne( { "_id": 3, "value": Long(1), "expectedType": "Long" } )
Decimal128
Decimal128() 값은 정확한 정밀도로 소수점 반올림을 에뮬레이트하는 128비트 소수점 기반 부동 소수점 숫자입니다.
이 기능은 금융, 세금, 과학, 전산 등 화폐 데이터 처리하는 애플리케이션에 사용됩니다.
Decimal128
BSON 유형은 IEEE 754 decimal128 부동 소수점 번호 지정 형식을 사용하여 소수점 이하 34자리(즉, 유효 숫자)를 지원하며 지수 범위는 -6143~+6144입니다.
db.types.insertOne( { "_id": 5, "value": Decimal128("1"), "expectedType": "Decimal128" } )
참고
MongoDB 드라이버에서
Decimal128
데이터 유형을 사용하려면 이를 지원하는 드라이버 버전을 사용해야 합니다.
동등성 및 정렬 순서
Decimal128
유형의 값은 실제 숫자 값을 기준으로 다른 숫자 유형과 비교되고 정렬됩니다. 바이너리 기반 Double
유형의 숫자 값은 일반적으로 십진수 기반 값의 근사치 표현을 가지며, 십진수 표현과 정확히 같지 않을 수 있습니다.
타임스탬프
MongoDB는 oplog에서 내부적으로 BSON 타임스탬프를 사용합니다. Timestamp
유형은 Java 타임스탬프 유형과 유사하게 작동합니다. 날짜와 관련된 작업에는 날짜 유형을 사용합니다.
Timestamp
서명에는 두 개의 선택적 매개변수가 포함됩니다.
Timestamp( { "t": <integer>, "i": <integer> } )
Parameter | 유형 | 기본값 | 정의 |
---|---|---|---|
| integer | 유닉스 시간 이후의 현재 시간. | 선택 사항. 초 단위 시간입니다. |
| integer | 1 | 선택 사항. 주어진 시간(초) 내에 수행할 여러 개의 작업이 있을 때 순서 설정에 사용됩니다. |
사용 예시는 새 문서에 타임스탬프 지정, 사용자 정의 타임스탬프 만들기를 참조하세요.
유형 확인
$type
쿼리 연산자를 사용하거나 객체 생성자를 검사하여 유형을 확인합니다.
Javascript typeof
연산자는 더욱 구체적인 Int32
나 ObjectId
보다는 number
또는 object
와 같이 일반적인 값을 반환합니다.
Javascript의 instanceof
연산자는 신뢰할 수 없습니다. 예를 들어 instanceof
는 서버 응답의 BSON 값을 사용자가 제공한 값과 다른 기본 클래스에 할당합니다.
사용 예는 $type()
을(를) 사용한 유형 검사 및 생성자를 사용한 유형 검사를 참조하세요.
예시
날짜를 문자열로 반환
날짜를 문자열로 반환하려면 다음 예시와 같이 Date()
메서드를 사용합니다.
var myDateString = Date();
변수 값을 인쇄하려면 다음과 같이 셸에 변수 이름을 입력합니다.
myDateString
myDateString
의 값이 그 결과입니다.
Wed Dec 19 2012 01:03:25 GMT-0500 (EST)
유형을 확인하려면 아래와 같이 typeof
연산자를 사용합니다.
typeof myDateString
이 작업은 string
을 반환합니다.
Return Date
mongosh
은(는) Date
유형의 객체를 ISODate
도우미로 래핑하지만 객체는 Date
유형이 그대로 유지됩니다.
다음 예시에서는 new Date()
생성자와 ISODate()
생성자를 모두 사용하여 Date
객체를 반환합니다.
var myDate = new Date(); var myDateInitUsingISODateWrapper = ISODate();
new
연산자를 ISODate()
생성자와 함께 사용할 수도 있습니다.
변수 값을 인쇄하려면 다음과 같이 셸에 변수 이름을 입력합니다.
myDate
결과는 ISODate()
헬퍼에서 래핑된 myDate
의 Date
값입니다.
ISODate("2012-12-19T06:01:17.171Z")
유형을 확인하려면 아래를 실행합니다.
var myDate = ISODate("2021-03-21T06:00:00.171Z") Object.prototype.toString.call(myDate) === "[object Date]"
이 작업은 true
을 반환합니다.
숫자 유형
types
컬렉션을 살펴보세요.
{ _id: 1, value: 1, expectedType: 'Int32' }, { _id: 2, value: Long("1"), expectedType: 'Long' }, { _id: 3, value: 1.01, expectedType: 'Double' }, { _id: 4, value: Decimal128("1.01"), expectedType: 'Decimal128' }, { _id: 5, value: 3200000001, expectedType: 'Double' }
이 표는 <QUERY>
에 해당하는 db.types.find( <QUERY> )
명령의 결과를 나타냅니다. 유형 이름과 별칭은 BSON types 페이지에서 확인할 수 있습니다.
쿼리 | 결과 | |||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
| |||||||||||||||||||||||||||||||
|
| |||||||||||||||||||||||||||||||
|
| |||||||||||||||||||||||||||||||
|
| |||||||||||||||||||||||||||||||
|
| |||||||||||||||||||||||||||||||
|
| |||||||||||||||||||||||||||||||
|
|
{ "value": 1.01 }
쿼리는 1.01
의 Double
표현을 암묵적으로 검색합니다. _id: 4
문서는 Decimal128
이므로 선택되지 않습니다.
하지만 참고로 { "value": 1 }
는 Int32
와 Long
유형을 모두 반환합니다.
기본 숫자 유형의 일관성
typeExample
컬렉션을 살펴봅니다. 이 컬렉션은 두 개의 동일한 문서 { "a": 1 }
로 구성됩니다. 첫 번째 문서는 레거시 mongo
셸에서, 두 번째 문서는 mongosh
에서 생성되었습니다.
집계 파이프라인에서 $type
연산자를 사용하여 각 셸에 할당된 유형을 확인할 수 있습니다.
db.typeExample.aggregate( [ { $project: { "valueType": { "$type": "$a" }, "_id": 0 } } ] )
레거시 mongo
셸에서 생성한 첫 번째 문서에서는 값이 double
로 저장되어 있습니다. mongosh
문서에서 값은 int
유형으로 저장되어 있습니다.
[ { valueType: 'double' // inserted in legacy mongo shell }, { valueType: 'int' // inserted in mongosh } ]
새 문서에 타임스탬프 적용
Timestamp()
를 사용하여 매개 변수 없이 기본 설정을 사용하여 여러 문서에 삽입할 수 있습니다.
db.flights.insertMany( [ { arrival: "true", ts: Timestamp() }, { arrival: "true", ts: Timestamp() }, { arrival: "true", ts: Timestamp() } ] )
db.flights.find({})
를 실행하여 타임스탬프를 확인합니다. 세 항목 모두 타임스탬프에 기록된 시간(초)이 동일하지만 각 항목마다 간격이 증가했다는 점을 알 수 있습니다.
[ { _id: ObjectId("6114216907d84f5370391919"), arrival: 'true', ts: Timestamp({ t: 1628709225, i: 1 }) }, { _id: ObjectId("6114216907d84f537039191a"), arrival: 'true', ts: Timestamp({ t: 1628709225, i: 2 }) }, { _id: ObjectId("6114216907d84f537039191b"), arrival: 'true', ts: Timestamp({ t: 1628709225, i: 3 }) } ]
사용자 정의 타임스탬프 생성
사용자 정의 매개 변수를 사용하여 특정 Timestamp
가 포함된 여러 문서를 삽입합니다.
이 작업은 세 개의 문서를 flights
컬렉션에 삽입하며 UNIX epoch 값 1627811580
을 이용해 ts
시간을 2021년 8월 1일 9시 53분(GMT)으로 설정합니다.
db.flights.insertMany( [ { arrival: "true", ts: Timestamp(1627811580, 10) }, { arrival: "true", ts: Timestamp(1627811580, 20) }, { arrival: "true", ts: Timestamp(1627811580, 30) } ] )
결과 문서는 다음과 같이 표시됩니다.
[ { _id: ObjectId("6123d8315e6bba6f61a1031c"), arrival: 'true', ts: Timestamp({ t: 1627811580, i: 10 }) }, { _id: ObjectId("6123d8315e6bba6f61a1031d"), arrival: 'true', ts: Timestamp({ t: 1627811580, i: 20 }) }, { _id: ObjectId("6123d8315e6bba6f61a1031e"), arrival: 'true', ts: Timestamp({ t: 1627811580, i: 30 }) } ]
$type()
으로 유형 검사
$type
쿼리 연산자는 데이터 유형에 해당하는 문자열 별칭이나 숫자 코드를 허용합니다. BSON 데이터 유형 및 해당되는 숫자 코드 목록은 BSON 유형 에서 확인할 수 있습니다.
예를 들어 아래와 같은 Decimal128
유형 확인은 동일합니다.
db.types.find( { "value": { $type: "decimal" } } ) db.types.find( { "value": { $type: 19 } } )
생성자를 이용한 유형 확인
constructor
객체를 검사하여 유형을 확인합니다. 예를 들어, db.collection.find()
출력값은 Cursor
입니다.
var findResults = db.housing.find({"multiUnit": true} ) findResults.constructor.name // Returns the type