문서 메뉴
문서 홈
/
MongoDB Shell
/

데이터 유형

이 페이지의 내용

  • 날짜
  • ObjectId
  • Int32
  • Long
  • Decimal128
  • 동등성 및 정렬 순서
  • 타임스탬프
  • 유형 확인
  • 예제
  • 날짜를 문자열로 반환
  • 반환 Date
  • 숫자 유형
  • 기본 숫자 유형의 일관성
  • 새 문서에 타임스탬프 적용
  • 사용자 정의 타임스탬프 생성
  • 다음으로 유형 검사: $type()
  • 생성자를 이용한 유형 확인

MongoDB Server는 JSON 형식을 사용하여 사용할 수 없는 일부 추가 데이터 유형을 지원하는BSON 형식을 사용하여 데이터를 저장합니다. 레거시 mongo 셸과 비교했을 때, MongoDB Shell(mongosh)의 유형 처리 방식은 MongoDB 드라이버에서 사용하는 기본 유형에 더 잘 부합합니다.

이 문서에서는 mongosh 와 레거시 mongo 셸 간의 유형 사용 변경 사항을 중점적으로 설명합니다. 지원되는 유형에 대한 추가 정보는 확장 JSON 참조를 참조하세요.

mongosh 는 날짜를 문자열이나 Date 객체로 반환하는 다양한 메서드를 제공합니다.

  • Date() 메서드는 현재 날짜를 문자열로 반환합니다.

  • new Date() 생성자는 ISODate() 래퍼를 이용해 Date 객체를 반환합니다.

  • ISODate() 생성자는 ISODate() 래퍼를 이용해 Date 객체를 반환합니다.

mongosh ObjectId 데이터 유형에 ObjectId() 래퍼 클래스를 제공합니다. 새 ObjectId를 생성하려면 mongosh 에서 다음 작업을 사용합니다.

new ObjectId

1.8.0부터 ObjectId 래퍼에서 아래 객체ID를 허용하지 않습니다.

  • ObjectId.prototype.generate

  • ObjectId.prototype.getInc

  • ObjectId.prototype.get_inc

  • ObjectId.getInc

다음도 참조하세요.

숫자를 32비트 정수로 변환할 수 있는 경우 mongoshInt32로 저장합니다. 그렇지 않은 경우 mongosh는 기본적으로 숫자를 Double로 저장합니다. mongosh에서 Int32로 저장되는 숫자 값은 mongo 셸에서 기본적으로 Double로 저장됩니다.

Int32() 생성자를 사용하여 32비트 정수를 명시적으로 지정할 수 있습니다.

db.types.insertOne(
{
"_id": 1,
"value": Int32("1"),
"expectedType": "Int32"
}
)

경고

mongosh와 레거시 mongo 셸을 모두 이용하여 동일한 컬렉션에 연결하는 경우 기본 Int32Double 유형이 일관적이지 않은 방식으로 저장될 수 있습니다.

Long() 생성자를 사용하여 64비트 정수를 명시적으로 지정할 수 있습니다.

db.types.insertOne(
{
"_id": 3,
"value": Long("1"),
"expectedType": "Long"
}
)

참고

레거시 mongo 셸에서 NumberLong() 는 문자열 또는 정수 값을 허용했습니다.mongosh 에서NumberLong() 문자열 값만 허용합니다. Long() -비트 64값과의 변환을 관리하는 메서드를 제공합니다.

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> } )
매개 변수
유형
기본값
정의
t
integer
선택 사항. 초 단위 시간입니다.
i
integer
1
선택 사항. 주어진 시간(초) 내에 수행할 여러 개의 작업이 있을 때 순서 설정에 사용됩니다. t 없이 i를 사용하면 아무런 영향이 없습니다.

사용 예시는 새 문서에 타임스탬프 지정, 사용자 정의 타임스탬프 만들기를 참조하세요.

$type 쿼리 연산자를 사용하거나 객체 생성자를 검사하여 유형을 확인합니다.

Javascript typeof 연산자는 더욱 구체적인 Int32ObjectId 보다는 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을 반환합니다.

mongosh Date 형식의 객체를 ISODate 도우미로 래핑합니다. 그러나 객체는 Date 유형으로 유지됩니다.

다음 예시에서는 new Date() 생성자와 ISODate() 생성자를 모두 사용하여 Date 객체를 반환합니다.

var myDate = new Date();
var myDateInitUsingISODateWrapper = ISODate();

new 연산자를 ISODate() 생성자와 함께 사용할 수도 있습니다.

변수 값을 인쇄하려면 다음과 같이 셸에 변수 이름을 입력합니다.

myDate

결과는 ISODate() 헬퍼에서 래핑된 myDateDate 값입니다.

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":
{
$type: "int"
}
}
{
_id: 1,
value: 1,
expectedType: 'Int32'
}
{
"value":
{
$type: "long"
}
}
{
_id: 2,
value: Long("1"),
expectedType: 'Long'
}
{
"value":
{
$type: "decimal"
}
}
{
_id: 4,
value: Decimal128("1"),
expectedType: 'Decimal128'
}
{
"value":
{
$type: "double"
}
}
{
_id: 3,
value: 1.01,
expectedType: 'Double'
}
{
_id: 5,
value: 3200000001,
expectedType: 'Double'
}
{
"value":
{
$type: "number"
}
}
{
_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'
}
{
"value": 1.01
}
{
_id: 3,
value: 1.01,
expectedType: 'Double'
}
{
"value": 1
}
{
_id: 1,
value: 1,
expectedType: 'Int32'
}
{
_id: 2,
value: Long("1"),
expectedType: 'Long'
}

{ "value": 1.01 } 쿼리는 1.01Double 표현을 암묵적으로 검색합니다. _id: 4 문서는 Decimal128이므로 선택되지 않습니다.

하지만 참고로 { "value": 1 }Int32Long 유형을 모두 반환합니다.

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 epoch1627811580을 이용해 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 쿼리 연산자는 데이터 유형에 해당하는 문자열 별칭이나 숫자 코드를 허용합니다. 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
← 레거시와의 호환성 변경 사항
방법 →