데이터베이스 및 SQL

MongoDB 확장 JSON타입을 확인하며 변환

엄격한 EJSON을 입력하고 두 가지 표현 방식과 정밀도 안내를 비교하세요.

MongoDB 확장 JSON

ObjectId 분석

EJSON 입력

JSON 결과

텍스트는 이 브라우저에서 처리합니다. 데이터베이스 연결이나 문서 업로드는 없습니다.

출력 및 해석

엄격한 JSON 값 하나만 입력하세요. 셸 표현식, 주석, 중복 키는 거부합니다.

일반 정수는 Int32/Int64, 소수·지수 표기는 Double로 추론합니다. 문자열은 그대로 둡니다.

입력 500,000 UTF-16 단위, 깊이 100, 노드 50,000개, 출력 2,000,000자까지 지원합니다.

입력 또는 옵션이 변경되었습니다. 변환 후 내보내세요.

MongoDB 확장 JSON은 데이터베이스에서 꺼낸 문서에 $oid나 $numberDecimal 같은 객체가 보일 때 필요합니다. 보기 좋게 만들려고 이 키를 지우면 수신 시스템이 복원하는 BSON 유형도 달라집니다.

예제에는 JavaScript의 안전한 정수 범위를 넘는 일련번호가 들어 있습니다. 자릿수를 보존하는 것과 원래 타입을 보존하는 것을 구분해 살펴보세요. 변환 결과를 생성해도 입력 문서는 그대로 남습니다.

MongoDB 확장 JSON을 사용하는 이유

문서를 넘기기 전에 표현이 바뀌는 부분을 확인하세요.

유지되는 래퍼를 구분

MongoDB 확장 JSON은 Canonical 표준 형식으로 시작합니다. Relaxed 완화 형식은 유한 숫자와 해당 날짜를 간단히 표시하지만 ObjectId와 Decimal128의 래퍼는 유지합니다. 원문과 결과를 나란히 비교할 수 있습니다.

숫자 래퍼는 열리고 식별자와 십진수 래퍼는 유지되는 세 데이터 행

큰 정수의 자릿수 유지

9007199254740993 같은 Long은 정확한 정수에서 출력합니다. 이 값이 수신 측에서 Number로 읽히면 반올림될 수 있다는 안내도 보여 줍니다. 변환 성공이 모든 소비자의 정밀도를 보장한다는 뜻은 아닙니다.

숫자 블록이 빠짐없이 문서 경계를 지나며 수신 측에 주의 표시가 있는 그림

수신 프로그램에 맞는 표현 선택

01

셸 코드 대신 데이터 입력

ObjectId()나 ISODate()는 JSON이 아닙니다. $oid와 $date를 사용하는 EJSON으로 먼저 내보내세요. 단일 값, 문서와 배열을 처리합니다.

  • 예제와 지우기는 교체 미리보기를 표시합니다. 적용 후 한 번 실행 취소하면 입력과 결과가 함께 복원됩니다.
02

숫자 타입과 날짜를 비교

타입 정보가 필요하면 Canonical을 선택하세요. Relaxed는 짧게 읽기 위한 모드이며, 출력에 남는 래퍼도 정상입니다.

  • 모드나 들여쓰기를 바꾸면 이전 결과의 복사와 다운로드가 즉시 비활성화됩니다.
03

자동 실행의 시점을 이해

자동 변환은 마지막 수정 후 350ms를 기다립니다. 끄면 예약된 처리를 취소하고 변환 버튼을 표시합니다.

  • Ctrl/Cmd + Enter로도 실행할 수 있습니다. 복사와 다운로드에는 화면 밖 텍스트까지 포함됩니다.

지원 타입과 숫자 해석

명확한 BSON 유형 집합

EJSON 변환은 ObjectId, Decimal128, Int32, Int64, Double, 날짜, Binary, UUID, 정규식, Timestamp와 MinKey/MaxKey를 검증합니다. UUID는 하위 타입 04의 바이너리 래퍼로 정규화하고 정규식 옵션은 정렬합니다. 정규식 자체를 실행하지는 않습니다.

넓은 날짜 범위

Canonical에서는 부호 있는 64비트 밀리초 문자열을 정확하게 유지합니다. JavaScript Date 범위 밖도 잘라내지 않습니다. Relaxed는 1970~9999년만 UTC ISO로 쓰며, 그 밖의 날짜는 밀리초 래퍼를 유지합니다.

추론과 원래 타입 구별

일반 정수는 범위에 따라 Int32 또는 Int64가 되고 소수나 지수 표기는 Double이 됩니다. 긴 십진 숫자는 이진 64비트로 반올림될 수 있습니다. 날짜처럼 생긴 문자열이나 24자리 16진 문자열을 임의로 타입 값으로 바꾸지 않습니다.

허용하는 입력과 한계

엄격한 v2 부분 집합
셸 실행, 자동 문법 수정, 이전 v1, Code/Scope, DBPointer, Undefined, Symbol 래퍼는 지원하지 않습니다. 알 수 없는 일반 필드는 유지하지만 알려진 래퍼에는 정해진 키만 있어야 합니다.
모든 래퍼 제거는 제공하지 않음
Relaxed도 EJSON입니다. 달러 기호로 시작하는 키를 전부 지우거나 Decimal128을 Number로 강제 변환하지 않습니다. 입력에서 이미 사라진 BSON 타입을 Canonical 전환만으로 되찾을 수는 없습니다.
한 번에 JSON 값 하나
JSONL, 이어 붙인 문서, BSON 바이너리, Hex/Base64 컨테이너, mongodump, 파일 업로드는 지원하지 않습니다. 문서를 개별 처리하거나 배열로 준비하세요. 데이터베이스 연결이나 컬렉션 가져오기도 하지 않습니다.
자원과 값의 범위 제한
입력은 500,000 UTF-16 단위, 깊이 100, 노드 50,000개이며 출력은 2,000,000자까지입니다. Int64 범위 초과, 잘못된 날짜, 중복 키는 전체 변환을 중단하며 일부 결과만 내보내지 않습니다.
정규화는 원본 바이트 복원이 아님
공백이나 날짜 표기가 바뀔 수 있습니다. Decimal128과 정규식 표현은 공식 엔진을 따르고 부동소수점은 이진 정밀도를 사용합니다. 입력을 수정하면 최신 변환이 성공할 때까지 기존 결과를 내보낼 수 없습니다.

MongoDB 확장 JSON 관련 질문

Canonical과 Relaxed는 무엇이 다른가요?

Canonical은 숫자에도 래퍼를 사용하여 타입 정보를 우선합니다. Relaxed는 유한 숫자와 해당 범위의 날짜를 읽기 쉽게 씁니다. 둘 다 JSON 문법이며 ObjectId와 Decimal128 같은 타입은 두 모드에서 모두 래퍼를 유지합니다.

mongosh 출력을 그대로 붙여 넣어도 되나요?

엄격한 JSON/EJSON으로 나온 텍스트라면 가능합니다. ObjectId("…"), ISODate("…"), NumberLong("…") 같은 셸 표현식은 거부합니다. 먼저 Extended JSON으로 내보내거나 문자열화하세요. 붙여 넣은 코드는 실행하지 않습니다.

NumberLong이 문자열로 표현되는 이유는 무엇인가요?

Canonical의 $numberLong 문자열은 일반 JSON 파서가 숫자를 먼저 반올림하지 않도록 자릿수를 보호합니다. 이 도구의 Relaxed 출력은 완전한 정수 리터럴입니다. 안전 범위 밖 값은 수신 프로그램도 손실 없는 파서를 사용해야 합니다.

Decimal128을 일반 number로 바꾸면 안 되나요?

JavaScript Number의 이진 64비트와 Decimal128의 십진 정밀도는 다릅니다. $numberDecimal 문자열은 십진 표현과 타입을 함께 보존합니다. 따라서 Relaxed에서도 유지하며, 금액처럼 십진 정밀도가 필요한 값을 임의로 변환하지 않습니다.

mongoexport 파일 전체도 변환하나요?

표시된 한도 안에서 하나의 JSON 값으로 구성되어 있어야 합니다. 배열은 가능하지만 기본 줄 단위 문서 출력은 JSONL이므로 거부합니다. 개별 문서를 처리하거나 적절한 내보내기 옵션으로 배열을 먼저 만드세요.

예상과 다른 값이 있나요?

타입을 확인한 뒤 저장

MongoDB 확장 JSON으로 돌아가 수신 측에 맞는 표현을 고르고 정밀도 안내를 확인한 뒤 결과를 저장하세요.