JSONを話す他のプログラムで、いくつかのMongoDBコマンドの生の出力を使用したいと思います。 mongoシェルでコマンドを実行すると、それらは Extended JSON 、「シェルモード」のフィールド、およびNumberLong
、Date
、Timestamp
などの特別なフィールドを表します。ドキュメントには「厳格なモード」への参照がありますが、シェルに対して有効にする方法、またはdoでdb.serverStatus()
などのコマンドを実行する方法はありませんmongodump
のような厳密なJSONを出力します。 Mongoに標準準拠のJSONを出力させるにはどうすればよいですか?
MongoDBシェルはJavascriptを使用するため、答えは簡単です:JSON.stringify()
を使用します。コマンドがdb.serverStatus()
の場合、これを簡単に行うことができます。
JSON.stringify(db.serverStatus())
これは、各フィールドの適切な「厳密モード」表現を出力しません({ "floatApprox": <number> }
の代わりに { "$numberLong": "<number>" }
)、しかし、あなたが気にするのが標準に準拠したJSONを出すことであるならば、これはトリックをするでしょう。
私はこれをmongoシェルで行う方法を見つけていませんが、回避策として、mongoexport
はクエリを実行でき、その出力は厳格モードを使用し、JSON入力を期待する他のコマンド(_json_pp
_またはjq
)。たとえば、クエリを実行する次のmongo Shellコマンドがあり、そのデータを使用してパイプラインを作成するとします。
_db.myItemsCollection.find({creationDate: {$gte: ISODate("2016-09-29")}}).pretty()
_
そのmongoシェルコマンドをこのシェルコマンドに変換し、例のために `json_ppにパイプします:
_mongoexport --jsonArray -d myDbName -c myItemsCollection -q '{"creationDate": {"$gte": {"$date": "2016-09-29T00:00Z"}}}' | json_pp
_
以下に示すように、クエリを厳格モード形式に変換し、データベース名とコレクション名を引数として渡し、シェルに適切に引用符を付ける必要があります。
@jbylerからの回答に基づいて、データを取得した後で sed を使用してnumberLongsを取り除くことができます。これは、Linuxを使用している場合です。
mongoexport --jsonArray -d dbName -c collection -q '{fieldName: {$regex: ".*turkey.*"}}' | sed -r 's/\{ "[$]numberLong" : "([0-9]+)" }/"\1"/g' | json_pp