Docs Menu
Docs Home
/
MongoDB Shell
/ /

EJSON.stringify()

項目一覧

  • 構文
  • コマンドフィールド
  • 動作
  • 出力スペースの変更
  • 出力フィールドを選択します
  • 関数を使用して出力フィールドを変換する
  • 関数を使用してネストされたオブジェクトの出力フィールドを変換
  • 関数を使用して BSON string を置き換える
  • mongosh 内からファイルへの書込み
  • コマンドラインから実行
  • フィルター出力フィールド
  • Legacy tojsononeline()
  • 詳細

EJSON.stringify()メソッドは BSON 値を string に変換します。

EJSON.stringify() メソッドは、 BSONオブジェクトを入力と、出力stringの形式を制御するオプションの修飾子として受け取ります。

EJSON.stringify(BSON object, [replacer], [space], [options])

EJSON.stringify()メソッドには次のフィールドがあります:

フィールド
タイプ
必要性
説明
value
BSON オブジェクト
必須
オブジェクトEJSON.stringify()は変換されます
replacer
配列または関数
任意

出力を変更します。 値が存在するが、配列または関数でない場合、 EJSON.stringify()はすべてのドキュメント フィールドを返します。

replacer は、配列または関数にすることができます。

効果
配列
出力に含めるドキュメント フィールドの配列。 配列要素は、返される JSON string に含めるフィールド名を指定する必要があります。
関数

keyvalueの 2 つのパラメータを持つ関数。 keyは関数のthisコンテキストを提供します。 EJSON returns the transformed value.

関数はオブジェクトごとに実行されます。 オブジェクト値は、関数の戻り値に置き換えられます。

例については、「 関数を使用して出力フィールドを変換する 」を参照してください。

spacer
整数または文字列
任意

出力のスペースを制御します。 spacerオプションのみを指定する場合は、 nullreplacerのプレースホルダーとして使用します。

効果
integer
各レベルでインデントするスペースの数。 最大値は10です。
string
各レベルのインデントに使用する文字。 このオプションでは、スペースまたはタブ以外の文字を使用すると、無効な JSON が生成されます。 詳しくは、 JSON.stringify() を参照してください
options
ブール値
任意

追加の構成オプション

オプション
default
意味
relaxed
true
拡張 JSON の緩和モードを有効にします。 該当する場合、BSON type 情報を添付する代わりにネイティブ JSON types を返します。

EJSON インターフェースは、インタラクティブなmongoshセッション内、または--evalを使用してシステム コマンドラインから呼び出すことができます。

対話型セッションから EJSON インターフェイスを呼び出します。

EJSON.stringify( db.sales.find().toArray(), null, 2 )

システム コマンドラインから EJSON インターフェイスを呼び出します。

mongosh --eval "EJSON.stringify( db.sales.find().toArray(), null, 2 )"

EJSON にドキュメントを渡す方法を制御するには、 mongoshカーソル メソッドイテレータのいずれかを使用します。

イテレータ
特性
ブロッキングは結果全体をバッファします
非ブロッキング、ドキュメントを 1 つずつ出力します
非ブロッキング、結果を手動で反復処理

これらの例を試すには、まずtestデータベースにsalesコレクションを作成します。

db.sales.insertMany( [
{ custId: 345, purchaseDate: ISODate("2023-07-04"), quantity: 4, cost: Decimal128("100.60"), },
{ custId: 346, purchaseDate: ISODate("2023-07-12"), quantity: 3, cost: Decimal128("175.45"), },
{ custId: 486, purchaseDate: ISODate("2023-08-01"), quantity: 9, cost: Decimal128("200.53"), },
] )

レベル間のインデントを増やすには、 spacingオプションを設定します。

EJSON.stringify( db.sales.findOne( { custId: 345 } ), null , 5 )

EJSON.stringify() は、各ドキュメント レベルの 5 つのスペースをインデントします。

{
"_id": {
"$oid": "64da90c1175f5091debcab26"
},
"custId": 345,
"purchaseDate": {
"$date": "2023-07-04T00:00:00Z"
},
"quantity": 4,
"cost": {
"$numberDecimal": "100.60"
}
}

ドキュメント フィールドのサブセットを選択するには、配列を使用してreplaceオプションを設定します。

EJSON.stringify( db.sales.find().toArray(), [ "quantity", "cost" ] )

EJSON では、各ドキュメントに対してquantitycostが形式されます。

[{"quantity":4,"cost":{}},{"quantity":3,"cost":{}},{"quantity":9,"cost":{}}]

この例ではspacingオプションが指定されていないため、EJSON は選択したフィールドを 1 行で返します。

フィールド値を変換するには、JavaScript 関数を使用してreplacerオプションを設定します。 例:

let queryResults = db.sales.find().toArray()
let replacer = function( key, value ){
if ( key === '_id' ) {
value = undefined;
}
if ( key === 'quantity' ) {
value = 2 * value;
}
return value;
}
EJSON.stringify( queryResults, replacer, 3 )

関数は、入力オブジェクトに対して再帰的に実行されます。

出力例:

[
{
"custId": 345,
"purchaseDate": {
"$date": "2023-07-04T00:00:00Z"
},
"quantity": 8,
"cost": {
"$numberDecimal": "100.60"
}
},
{
"custId": 346,
"purchaseDate": {
"$date": "2023-07-12T00:00:00Z"
},
"quantity": 6,
"cost": {
"$numberDecimal": "175.45"
}
},
{
"custId": 486,
"purchaseDate": {
"$date": "2023-08-01T00:00:00Z"
},
"quantity": 18,
"cost": {
"$numberDecimal": "200.53"
}
}
]

replacer関数は、 _idquantityの 2 つのフィールドを更新します。

EJSON.stringify() は未定義の値を持つフィールドを無視するため、_id: undefined を設定すると出力stringから _id フィールドが削除されます。

この関数は、出力stringの quantity フィールドも変更します。 すべての quantity 値は 2 を掛けて出力stringになります。 EJSON.stringify()はコレクションを更新しません。

ネストされたアドレスを使用してsalesWithAddressコレクションを作成します。

db.salesWithAddress.insertMany( [
{ custId: 345, purchaseDate: ISODate("2023-07-04"),
quantity: 4, cost: Decimal128("100.60"),
address: { number: 100, street: "Main Street", ZIP: 12345 } },
{ custId: 346, purchaseDate: ISODate("2023-07-12"),
quantity: 3, cost: Decimal128("175.45"),
address: { number: 200, street: "East Street", ZIP: 12345 } }
] )

次の例では、 replacer関数を使用して住所の郵便番号を55555に変更します。

// Retrieve the salesWithAddress contents as an array and save
// in queryResults
let queryResults = db.salesWithAddress.find().toArray()
// Define a replacer function to change the ZIP codes
let replacer = function( key, value ) {
if (key === 'address') {
value.ZIP = 55555;
}
return value;
}
// Run EJSON.stringify() to change the ZIP codes in queryResults
EJSON.stringify( queryResults, replacer, 3 )

出力例:

[
{
"_id": {
"$oid": "65498c6562f443aa1490070f"
},
"custId": 345,
"purchaseDate": {
"$date": "2023-07-04T00:00:00Z"
},
"quantity": 4,
"cost": {
"$numberDecimal": "100.60"
},
"address": {
"number": 100,
"street": "Main Street",
"ZIP": 55555
}
},
{
"_id": {
"$oid": "65498c6562f443aa14900710"
},
"custId": 346,
"purchaseDate": {
"$date": "2023-07-12T00:00:00Z"
},
"quantity": 3,
"cost": {
"$numberDecimal": "175.45"
},
"address": {
"number": 200,
"street": "East Street",
"ZIP": 55555
}
}
]

BSONデータ型と対応する数値コードのリストについては、「 BSON types 」を参照してください。

次の例では、 replacer関数を使用して、BSON string を string "This is a string"に置き換えます。

// Retrieve the salesWithAddress contents as an array and save
// in queryResults
let queryResults = db.salesWithAddress.find().toArray()
// Define a replacer function to replace the strings
let replacer = function( key, value ) {
if (typeof value === "string") {
return "This is a string";
}
return value;
}
// Run EJSON.stringify() to replace the strings in queryResults
EJSON.stringify( queryResults, replacer, 3 )

出力例:

[
{
"_id": {
"$oid": "This is a string"
},
"custId": 345,
"purchaseDate": {
"$date": "This is a string"
},
"quantity": 4,
"cost": {
"$numberDecimal": "This is a string"
},
"address": {
"number": 100,
"street": "This is a string",
"ZIP": 12345
}
},
{
"_id": {
"$oid": "This is a string"
},
"custId": 346,
"purchaseDate": {
"$date": "This is a string"
},
"quantity": 3,
"cost": {
"$numberDecimal": "This is a string"
},
"address": {
"number": 200,
"street": "This is a string",
"ZIP": 12345
}
}
]

mongosh内のファイルに書き込むには、 fs API を使用します。 fsに渡す string の形式を設定するには、 EJSON.stringify()を使用します。

const sales_2023_07 = db.sales.find(
{
purchaseDate:
{
$gte: ISODate( "2023-07-01" ),
$lte: ISODate( "2023-07-31" )
}
}
)
fs.writeFileSync(
'sales_2023_07.json',
EJSON.stringify( sales_2023_07.toArray(), null, 2 )
)

この例では、 salesコレクションで 7 月の売上、 2023をクエリします。

  • sales_2023_07 は MongoDB BSON オブジェクトを保存します。

  • EJSON.stringify() はオブジェクトを JSON string としてフォーマットします。

  • fs.writeFileSync() は、形式が設定された stringsales_2023_07.json mongoshを、 を実行したディレクトリにある ファイルに書込みます。

オペレーティング システム shell からクエリを実行するには、 --evalオプションを使用します。

# Note: This example is formatted to fit on the page.
mongosh --quiet \
--eval "db.sales.find().forEach( \
o => print( EJSON.stringify( o ) ) )"

このコマンドは、次のようにドキュメントごとに 1 行の JSON を返します。

  • --quietmongosh接続情報を抑制します

  • --eval findメソッドを呼び出す

  • .forEach は、 mongoshに応答を反復処理するように指示する JavaScript メソッドです

  • EJSON.stringify() は各ドキュメントを JSON に変換します

出力は次のとおりです。

{"_id":{"$oid":"64da90c1175f5091debcab26"},"custId":345,"purchaseDate":{"$date":"2023-07-04T00:00:00Z"},"quantity":4,"cost":{"$numberDecimal":"100.60"}}
{"_id":{"$oid":"64da90c1175f5091debcab27"},"custId":346,"purchaseDate":{"$date":"2023-07-12T00:00:00Z"},"quantity":3,"cost":{"$numberDecimal":"175.45"}}
{"_id":{"$oid":"64da90c1175f5091debcab28"},"custId":486,"purchaseDate":{"$date":"2023-08-01T00:00:00Z"},"quantity":9,"cost":{"$numberDecimal":"200.53"}}

単一行の出力形式は、スクリプトに便利です。 EJSON.stringify()は、人間が判読できる形式を生成することもできます。

# Note: This example is formatted to fit on the page.
mongosh --quiet \
--eval "db.sales.find().forEach( \
o => print( EJSON.stringify(o, null, 3 ) ) )"

出力は次のとおりです。

# Note: This is only the first document.
{
"_id": {
"$oid": "64da90c1175f5091debcab26"
},
"custId": 345,
"purchaseDate": {
"$date": "2023-07-04T00:00:00Z"
},
"quantity": 4,
"cost": {
"$numberDecimal": "100.60"
}
}
  • o は、 .forEach()の反復ごとにEJSON.stringify()が変換する BSON 値です。

  • null は、任意のreplacerのプレースホルダーです。 replacerが存在しない場合、 EJSON.stringify()は定義された値を持つすべてのフィールドを返します。

  • 3 は、 spacer値です。 これは、 EJSON.stringify()に新しいレベルの各レベルを 3 スペースでインデントするように指示します。

出力stringに追加のタイプ情報を含めるには、{ relaxed: false } オプションを追加します。

# Note: This example is formatted to fit on the page.
mongosh --quiet \
--eval "db.sales.find().forEach( \
o => print( \
EJSON.stringify( o, null, 3, { relaxed: false } ) \
) )"

出力は次のとおりです。

# Note: This is only the first document.
{
"_id": {
"$oid": "64da90c1175f5091debcab26"
},
"custId": {
"$numberInt": "345"
},
"purchaseDate": {
"$date": {
"$numberLong": "1688428800000"
}
},
"quantity": {
"$numberInt": "4"
},
"cost": {
"$numberDecimal": "100.60"
}
}

EJSON.stringify() は、 jqのような追加の JSON パーサーの必要性を減らす形式オプションを提供します。

# Note: This example is formatted to fit on the page.
mongosh --quiet \
--eval "EJSON.stringify( \
db.sales.find( {}, \
{ _id: 0, custId: 1, quantity: 1 } ).toArray(), null, 2 \
);"

出力は次のとおりです。

[
{
"custId": 345,
"quantity": 4
},
{
"custId": 346,
"quantity": 3
},
{
"custId": 486,
"quantity": 9
}
]

mongosh shell は、レガシーのmongo shell とは異なる出力を返します。 レガシーのmongo shell と同様の方法で出力をフォーマットする必要があるスクリプトがある場合は、 EJSON.stringify()を使用してmongosh出力を再フォーマットしてみてください。

mongoshmongoでサンプル クエリを実行すると、さまざまな形式が表示されます。

db.sales.find( { custId: 345 } )

レガシー出力:

{ "_id" : ObjectId("64da90c1175f5091debcab26"), "custId" : 345, "purchaseDate" : ISODate("2023-07-04T00:00:00Z"), "quantity" : 4, "cost" : NumberDecimal("100.60") }

mongosh output:

db.sales.find( { custId: 345 } )
[
{
_id: ObjectId("64da90c1175f5091debcab26"),
custId: 345,
purchaseDate: ISODate("2023-07-04T00:00:00.000Z"),
quantity: 4,
cost: Decimal128("100.60")
}
]

EJSON.stringify()を使用して出力を再フォーマットします。

EJSON.stringify( db.sales.find( { custId: 345 } ).toArray() )
[{"_id":{"$oid":"64da90c1175f5091debcab26"},"custId":345,"purchaseDate":{"$date":"2023-07-04T00:00:00Z"},"quantity":4,"cost":{"$numberDecimal":"100.60"}}]

戻る

Serialize()