web-dev-qa-db-ja.com

mongodbに厳密なJSONを出力させる

JSONを話す他のプログラムで、いくつかのMongoDBコマンドの生の出力を使用したいと思います。 mongoシェルでコマンドを実行すると、それらは Extended JSON 、「シェルモード」のフィールド、およびNumberLongDateTimestampなどの特別なフィールドを表します。ドキュメントには「厳格なモード」への参照がありますが、シェルに対して有効にする方法、またはdoでdb.serverStatus()などのコマンドを実行する方法はありませんmongodumpのような厳密なJSONを出力します。 Mongoに標準準拠のJSONを出力させるにはどうすればよいですか?

このトピックには 複数その他質問 がありますが、特に満足できる答えは見つかりません。

28
whereswalden

MongoDBシェルはJavascriptを使用するため、答えは簡単です:JSON.stringify()を使用します。コマンドがdb.serverStatus()の場合、これを簡単に行うことができます。

JSON.stringify(db.serverStatus())

これは、各フィールドの適切な「厳密モード」表現を出力しません({ "floatApprox": <number> } の代わりに { "$numberLong": "<number>" })、しかし、あなたが気にするのが標準に準拠したJSONを出すことであるならば、これはトリックをするでしょう。

30
whereswalden

私はこれを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
_

以下に示すように、クエリを厳格モード形式に変換し、データベース名とコレクション名を引数として渡し、シェルに適切に引用符を付ける必要があります。

5
jbyler

@jbylerからの回答に基づいて、データを取得した後で sed を使用してnumberLongsを取り除くことができます。これは、Linuxを使用している場合です。

mongoexport --jsonArray -d dbName -c collection -q '{fieldName: {$regex: ".*turkey.*"}}' | sed -r 's/\{ "[$]numberLong" : "([0-9]+)" }/"\1"/g' | json_pp
0
Kieveli