データベースとSQL

MongoDB拡張JSON型の違いを見ながら

厳密なEJSONを入力し、標準形式と読みやすい形式を比較できます。

MongoDB拡張JSON

ObjectIdを調べる

EJSON入力

JSON結果

テキストはこのブラウザー内で処理します。データベースへの接続や文書の送信は行いません。

出力と解釈

厳密なJSON値を1つ入力。シェル式、コメント、重複キーは使えません。

裸の整数はInt32/Int64、小数・指数表記はDoubleと解釈します。文字列の型は推測しません。

入力500,000 UTF-16単位、深さ100、50,000ノード、出力2,000,000文字まで。

入力または設定が変わりました。再変換してから出力してください。

MongoDB拡張JSONは、エクスポートした日付が文字列に見えたり、数値に$numberLongが付いていたりするときに役立ちます。包装を単純に取り除くと、読み込み先で元の型に戻せなくなることがあります。

サンプルには安全な整数範囲を超える連番を入れています。桁が変わらないことと、BSONの型情報が残ることを分けて確認してください。変換結果を作っても入力側の文書は書き換えません。

MongoDB拡張JSONを使う理由

受け取り側へ渡す前に、変わる表現を確かめます。

消える包装と残る包装を区別

MongoDB拡張JSONでは標準モードのCanonicalが初期値です。Relaxedにすると有限数値と一部の日付は簡潔になりますが、ObjectIdとDecimal128の包装は残ります。原文と結果を並べて確認できます。

数値の包装だけが開き、識別子と十進数の包装が残る3行のデータ

大きな連番の桁を保持

9007199254740993のようなLongは正確な整数から書き出します。読み込み先がJavaScript Numberを使う場合のリスクも示すため、JSON変換が成功したという表示だけで精度を判断せずに済みます。

桁を表すブロックが欠けずに文書境界を通り、受信側に注意記号がある図

読み込み先の期待する形式を選ぶ

01

シェル式をデータに直す

ObjectId()やISODate()はJSON構文ではありません。$oidや$dateを含むEJSONとして出力してから入力してください。単一の値、文書、配列を受け付けます。

  • サンプルとクリアは置換のプレビューを表示し、適用後は入力と結果を1回戻せます。
02

日付と数値を一緒に比較

1970年より前の日付はRelaxedでもミリ秒の包装が残ります。数値が短くなった場合は型情報の注意も確認してください。

  • 形式やインデントを変更すると、古い結果のコピーと保存はすぐに無効になります。
03

更新のタイミングを決める

自動変換は最後の編集から350ms待ちます。オフにすると待機処理を取り消し、変換ボタンを表示します。

  • Ctrl/Cmd + Enterでも実行できます。コピーと保存には画面外も含む結果全体が入ります。

扱う型と数値の解釈

検証する型を明示

ObjectId、Decimal128、Int32、Int64、Double、日付、Binary、UUID、正規表現、Timestamp、MinKey/MaxKeyに対応します。UUIDはサブタイプ04のバイナリ包装に正規化されます。正規表現はオプションを並べ替えるだけで、検索を実行しません。

極端な日付も整数で保持

Canonicalでは符号付き64ビットのミリ秒を文字列のまま扱い、JavaScript Dateの範囲外でも切り捨てません。RelaxedでUTCのISO表記にするのは1970〜9999年だけです。それ以外はミリ秒の包装を維持します。

文字列を勝手に型変換しない

裸の整数は範囲で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は数値にも包装を付け、BSONの型を優先します。Relaxedは有限数値や適用範囲内の日付を読みやすくします。どちらもJSONとして読めますが、ObjectIdやDecimal128の包装は共通して残ります。

mongoshの表示をそのまま貼れますか?

既に厳密なJSON/EJSONであれば貼れます。ObjectId("…")、ISODate("…")、NumberLong("…")を含むシェル表現はエラーになります。先にExtended JSONとしてエクスポートまたは文字列化してください。

NumberLongが文字列になっているのはなぜですか?

Canonicalでは$numberLongの文字列で整数の桁を保護します。このツールのRelaxed出力は完全な整数リテラルになります。ただし受信側のJSON.parseがNumberへ変換すると、安全な範囲外の値は丸められます。

Decimal128を普通の数値にできないのはなぜですか?

JavaScript Numberの二進64ビット精度とDecimal128の十進精度は異なります。$numberDecimalは値の十進表現と型を維持するための包装です。Relaxedでも取り除きません。

mongoexportのファイル全体を変換できますか?

上限内で単一のJSON値になっている場合だけです。配列形式なら扱えますが、標準的な行区切りの複数文書はJSONLなので拒否します。個別に処理するか、適切なエクスポート設定で配列にしてください。

気になる解析結果がありますか?

型を確認してから保存

MongoDB拡張JSONに戻り、必要な表現を選び、精度の注意を確認して結果を保存してください。