데이터 유형
이 페이지의 내용
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)에서 아래 객체ID를 허용하지 않습니다.
ObjectId.prototype.generate
ObjectId.prototype.getInc
ObjectId.prototype.get_inc
ObjectId.getInc
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