경고
다음 문서 MongoDB Server 다운로드 에 포함된 셸mongo
과 관련이 있습니다. 새로운 MongoDB Shell ()에 대한 자세한mongosh
내용은 mongosh 설명서를 참조하세요.
두 셸의 차이점을 이해하려면 mongo
shell 과 mongosh
비교를 참조하세요.
MongoDB BSON 은 JSON 이외의 추가 데이터 유형을 지원합니다. 드라이버 는 호스트 언어에서 이러한 데이터 유형에 대한 기본 지원을 제공하며 mongo
shell 은 mongo
JavaScript shell 에서 이러한 데이터 유형을 사용할 수 있도록 지원하는 여러 헬퍼 클래스도 제공합니다. 자세한 내용은 확장 JSON 참조를 참조하세요.
유형
날짜
mongo
shell 은 날짜를 string 또는 Date
객체로 반환하는 다양한 메서드를 제공합니다.
Date()
메서드는 현재 날짜를 문자열로 반환합니다.new Date()
생성자는ISODate()
래퍼(wrapper)를 이용해Date
객체를 반환합니다.ISODate()
생성자는ISODate()
래퍼(wrapper)를 이용해Date
객체를 반환합니다.
내부적으로 Date 객체는 유닉스 시간 (1970년 1월 1일) 이후의 밀리초 수를 나타내는 부호 있는 64비트 정수로 저장됩니다.
모든 데이터베이스 작업과 드라이버가 전체 64비트 범위를 지원하는 것은 아닙니다. 포함 범위 0
~ 9999
이내의 연도가 있는 날짜로 안전하게 작업할 수 있습니다.
날짜를 문자열로 반환
날짜를 문자열로 반환하려면 다음 예시와 같이 Date()
메서드를 사용합니다.
var myDateString = Date();
변수 값을 인쇄하려면 다음과 같이 셸에 변수 이름을 입력합니다.
myDateString
myDateString
의 값이 그 결과입니다.
Wed Dec 19 2012 01:03:25 GMT-0500 (EST)
유형을 확인하려면 아래와 같이 typeof
연산자를 사용합니다.
typeof myDateString
이 작업은 string
을 반환합니다.
Return Date
mongo
shell 은 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")
유형을 확인하려면 아래와 같이 instanceof
연산자를 사용합니다.
myDate instanceof Date myDateInitUsingISODateWrapper instanceof Date
이 작업은 둘 다 true
를 반환합니다.
ObjectId
mongo
shell 은 ObjectId 데이터 유형에 대한 ObjectId()
래퍼 클래스를 제공합니다. 새 ObjectId 를 생성하려면 mongo
shell 에서 다음 작업을 사용합니다.
new ObjectId
NumberLong
mongo
shell 은 기본적으로 모든 숫자를 부동 소수점 값으로 처리합니다. mongo
shell 은 64비트 정수를 처리하기 위해 NumberLong()
래퍼를 제공합니다.
NumberLong()
래퍼는 long을 string 로 허용합니다.
NumberLong("2090845886852")
다음 예제에서는 NumberLong()
래퍼를 사용하여 컬렉션에 씁니다.
db.collection.insertOne( { _id: 10, calc: NumberLong("2090845886852") } ) db.collection.updateOne( { _id: 10 }, { $set: { calc: NumberLong("2555555000000") } } ) db.collection.updateOne( { _id: 10 }, { $inc: { calc: NumberLong("5") } } )
확인을 위해 문서를 조회합니다.
db.collection.findOne( { _id: 10 } )
반환된 문서에서 calc
필드에는 NumberLong
객체가 포함되어 있습니다.
{ "_id" : 10, "calc" : NumberLong("2555555000005") }
$inc
를 사용하여 NumberLong
객체가 포함된 필드의 값을 float 단위로 증가시키면 다음 예제와 같이 데이터 유형이 부동 소수점 값으로 변경됩니다.
$inc
를 사용하여calc
필드를5
만큼 증가시키며,mongo
shell 은 부동 소수점으로 처리합니다.db.collection.updateOne( { _id: 10 }, { $inc: { calc: 5 } } ) 업데이트된 문서를 조회합니다.
db.collection.findOne( { _id: 10 } ) 업데이트된 문서에서
calc
필드에 부동 소수점 값이 포함되어 있습니다.{ "_id" : 10, "calc" : 2555555000010 }
참고
NumberLong()
생성자는 mongo
shell 에서 integer
값을 허용하지만(예: 따옴표 제외), 이 방법은 권장되지 않습니다. JavaScript에 정의된 Number.MAX_SAFE_INTEGER
(숫자 2^53 - 1
)보다 큰 정수 값을 지정하면 예기치 않은 동작이 발생할 수 있습니다.
NumberInt
mongo
shell 은 기본적으로 모든 숫자를 부동 소수점 값으로 처리합니다. mongo
shell 은 32비트 정수를 명시적으로 지정할 수 있는 NumberInt()
생성자를 제공합니다.
NumberDecimal
버전 3.4에 새로 추가되었습니다.
mongo
shell 은 기본적으로 모든 숫자를 64비트 부동 소수점 double
값으로 처리합니다. mongo
shell 은 정확한 정밀도로 소수점 반올림을 에뮬레이션할 수 있는 128비트 소수점 기반 부동 소수점 값을 명시적으로 지정할 수 있는 NumberDecimal()
생성자를 제공합니다. 이 기능은 금융, 세금, 과학 계산 등 화폐 데이터 를 처리하는 애플리케이션을 위한 것입니다.
decimal
BSON 유형 은 소수점 34 자리를 지원하는 IEEE 754 십진수128 부동 소수점 번호 지정 형식을 사용합니다(즉, 유효 숫자) 및 지수 범위는 -6143 ~ +6144 입니다.
NumberDecimal()
생성자는 decimal
값을 string 로 허용합니다.
NumberDecimal("1000.55")
값은 다음과 같이 데이터베이스에 저장됩니다.
NumberDecimal("1000.55")
NumberDecimal()
생성자는 mongo
shell 의 double
값도 허용합니다(예: 따옴표 제외), 정밀도를 잃을 위험이 있으므로 권장하지 않습니다. 생성자는 십진수 기반 매개변수의 이진 기반 double
정밀도 표현(정밀도 손실 가능성이 있음)을 생성한 다음, 해당 값을 정밀도가 15 자리인 decimal
값으로 변환합니다. 다음 예제에서는 값을 암시적으로 double
로 전달하고 15 자리의 정밀도로 값이 생성되는 방법을 보여 줍니다.
NumberDecimal(1000.55)
값은 다음과 같이 데이터베이스에 저장됩니다.
NumberDecimal("1000.55000000000")
다음 예제에서는 값을 암시적으로 double
(으)로 전달하고 정밀도 손실이 어떻게 발생할 수 있는지 보여줍니다.
NumberDecimal(9999999.4999999999)
값은 다음과 같이 데이터베이스에 저장됩니다.
NumberDecimal("9999999.50000000")
참고
MongoDB 드라이버에서 decimal
데이터 유형을 사용하려면 이를 지원하는 드라이버 버전을 사용해야 합니다.
동등성 및 정렬 순서
decimal
유형의 값은 실제 숫자 값을 기준으로 다른 숫자 유형과 비교되고 정렬됩니다. 바이너리 기반 double
유형의 숫자 값은 일반적으로 십진수 기반 값의 근사치 표현을 가지며 decimal
표현과 정확히 같지 않을 수 있으므로 decimal
값이 같은지 확인할 때 NumberDecimal()
생성자를 사용합니다. numbers
컬렉션의 다음 문서와 함께 다음 예제를 고려하세요.
{ "_id" : 1, "val" : NumberDecimal( "9.99" ), "description" : "Decimal" } { "_id" : 2, "val" : 9.99, "description" : "Double" } { "_id" : 3, "val" : 10, "description" : "Double" } { "_id" : 4, "val" : NumberLong("10"), "description" : "Long" } { "_id" : 5, "val" : NumberDecimal( "10.0" ), "description" : "Decimal" }
아래 표의 쿼리를 db.numbers.find(<query>)
메서드에 연결하면 다음 결과가 반환됩니다.
쿼리 | 결과 |
---|---|
{ "val": 9.99 } | { "_id": 2, "val": 9.99, "description": "double" } |
{ "val": NumberDecimal( "9.99" ) } | { "_id": 1, "val": NumberDecimal( "9.99" ), "description": "Decimal" } |
{ val: 10 } | { "_id": 3, "val": 10, "description": "Double" } { "_id": 4, "val": NumberLong(10), "description": "Long" } { "_id": 5, "val": NumberDecimal( "10.0" ), "description": "Decimal" } |
{ val: NumberDecimal( "10" ) } | { "_id": 3, "val": 10, "description": "Double" } { "_id": 4, "val": NumberLong(10), "description": "Long" } { "_id": 5, "val": NumberDecimal( "10.0" ), "description": "Decimal" } |
첫 번째 쿼리인 { "val": 9.99 }
은 값의 decimal
표현과 같지 않은 9.99
의 double
표현을 암시적으로 검색합니다.
NumberDecimal()
생성자는 9.99
의 decimal
표현으로 문서를 쿼리하는 데 사용됩니다. double
유형의 값은 9.99
decimal
표현의 정확한 값과 일치하지 않기 때문에 제외됩니다.
정수를 쿼리할 때 모든 숫자 유형에서 일치하는 값이 반환됩니다. 예를 들어 10
의 double
표현을 쿼리하면 결과에 10.0
의 decimal
표현이 포함되며, 그 반대의 경우도 마찬가지입니다.
decimal
유형 확인
decimal
유형을 테스트하려면 $type
연산자를 string 별칭 "decimal"
또는 decimal
유형의 숫자 코드인 19
와 함께 사용합니다.
db.inventory.find( { price: { $type: "decimal" } } )
셸 에서 유형 확인 mongo
shell
필드 유형을 결정하기 위해 mongo
shell 은 instanceof
및 typeof
연산자를 제공합니다.
instanceof
instanceof
값이 특정 유형의 인스턴스인지 테스트하기 위해 부울을 반환합니다.
예를 들어 다음 작업은 _id
필드가 ObjectId
유형의 인스턴스인지 테스트합니다.
mydoc._id instanceof ObjectId
이 작업은 true
을 반환합니다.
typeof
typeof
필드의 유형을 반환합니다.
예를 들어 다음 연산은 _id
필드의 유형을 반환합니다.
typeof mydoc._id
이 경우 typeof
은(는) ObjectId
유형이 아닌 보다 일반적인 object
유형을 반환합니다.