1. ホーム
  2. データベース
  3. モンゴルディーブ

MongoDB mongoexportツールの使い方入門

2022-01-19 23:42:35

01 基本的な紹介

   mongoexport はデータエクスポートツールで、mysql の select into outfile 構文と同じようにデータベースから json や csv 形式でデータをエクスポートするために使われます。

mongosに直接接続するか、mongodに接続することでデータをエクスポートすることができます。クラスタがシャード化されている場合、mongos に接続するとすべてのシャードでこのコレクションに関連するデータがエクスポートされます。

02 共通パラメータ

-h:データベースホストのIPを指定します。

-u:データベースのユーザー名を指定します。

-p:データベースのパスワードを指定します。

-d:データベースの名前を指定します。

-c:コレクションの名前を指定します。

-f:インポートする列を指定します。

--type: デフォルトは json 型、csv 型をエクスポート可能

-o: エクスポート先のファイル名を指定します。指定しない場合は、標準出力にエクスポートされます。

-q: クエリフィルタをjsonで入力し、クエリの結果をエクスポートします。

上記の共通引数には、対応する長引数のオプションもあります。例えば、-hは、代わりに--hostと入力することもできます。パラメータの詳細は mongoexport --help で見ることができます。

03コマンド

1. 以下のコマンドで、データベース new の下にあるテストコレクションの番号フィールドをエクスポートします。

mongoexport --port=27016 -u "yeyz" --authenticationDatabase "admin" -p "123456" -d new -c test --fields=number -o /data/test.json
2021-02-23T22:09:52.481+0800 connected to: localhost:27016
2021-02-23T22:09:52.512+0800 exported 2000 records

エクスポートの結果を見てみましょう。

{"_id":{"$oid":"6006c46993a711b384cc8c92"},"number":1000.0}
{"_id":{"$oid":"6006c46993a711b384cc8c93"},"number":1001.0}
{"_id":{"$oid":"6006c46993a711b384cc8c94"},"number":1002.0}
{"_id":{"$oid":"6006c46993a711b384cc8c95"},"number":1003.0}
{"_id":{"$oid":"6006c46993a711b384cc8c96"},"number":1004.0}
{"_id":{"$oid":"6006c46993a711b384cc8c97"},"number":1005.0}
{"_id":{"$oid":"6006c46993a711b384cc8c98"},"number":1006.0}
{"_id":{"$oid":"6006c46993a711b384cc8c99"},"number":1007.0}
{"_id":{"$oid":"6006c46993a711b384cc8c9a"},"number":1008.0}
{"_id":{"$oid":"6006c46993a711b384cc8c9b"},"number":1009.0}
{"_id":{"$oid":"6006c46993a711b384cc8c9c"},"number":1010.0}
{"_id":{"$oid":"6006c46993a711b384cc8c9d"},"number":1011.0}
{"_id":{"$oid":"6006c46993a711b384cc8c9e"},"number":1012.0}

numberフィールドだけを指定しても、_idフィールドが自動的にエクスポートされていることがわかります。このことから、エクスポートされる形式がjsonタイプであれば、_idフィールドはデフォルトでエクスポートされるという結論に達します。

デフォルトのエクスポートタイプはjsonです。もし、csvをエクスポートしたい場合は、--type=csvパラメータを追加します。このパラメータを追加した後、結果は以下のようになります。

number
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011

ご覧の通り、_idフィールドは自動的に出力されません。これも論点になりそうです。csv型では_idフィールドが出力されず、json型では_idフィールドが出力されるのは、ツールの小さなバグかもしれませんね。

2. 特定のクエリの結果、例えば number=10 の行の結果をエクスポートします。

[root@VM-0-14-centos ~]# mongoexport --port=27016 -u "yeyz" --authenticationDatabase "admin" -p "123456" -d new -c test --type=csv -q {"number":10} --fields=number -o /data/test.json 
2021-02-23T22:38:18.319+0800 connected to: localhost:27016
2021-02-23T22:38:18.321+0800 exported 1 record

qパラメータの後に直接クエリ条件を指定することができます。

04 経験値

   今日の作業はスライスのクラスタに対して行われ、合計7スライス、3億以上のデータをエクスポートしました。1スライスで約5000wのデータ、エクスポートされたデータ1個につき2フィールド、各スライスのエクスポート時間は約2時間でした。

マシンのハードウェア構成

  • SATAハードディスク 4TB
  • コモンメモリ 128G
  • intel Xeon E5-4シリーズ

もちろん、この値はあくまで経験値なので、エクスポートされるフィールドの数が多かったり、フィールドが長かったりすると、この値はあまり参考にならないかもしれません。

実際にデータのエクスポートを行ってみると、エクスポートを行うmongodbサーバーの負荷が多少上がり、メモリ使用量も多少増えましたが、特に目立ったパフォーマンスの乱れはなく、全体の処理でデータベースをロックすることもないので、やはり比較的安全な方法でした。

オンライン業務、特に機密性の高い業務を行う場合、業務への影響を最小限に抑えるため、mongosでデータエクスポートを行う場合は、まずこのmongosが業務から見えないようにし、エクスポートを行った後、サービスを外部から再プロビジョニングすることをお勧めします。mongodでデータエクスポートを行う場合は、オンライン業務への影響を避けるため、セカンダリーノードを選択するとよいでしょう。

05 逆インポート

   mongodbにはmongoimportというツールもあり、mongoexportでエクスポートしたデータをmongodbのデータベースにインポートすることができます。以下はmongoimportのコマンドです。

[root@VM-0-14-centos ~]# mongoimport --port=27016 -u "yeyz" --authenticationDatabase "admin" -p "123456" -d new -c test1 --type=csv --fields=number --file=/data/test.csv
2021-02-23T22:44:21.930+0800 connected to: localhost:27016
2021-02-23T22:44:22.146+0800 imported 2001 documents

   mongoimport の操作全体は insert と似ており、パラメータも mongoexport とほぼ同じです。より重要なパラメータは writeconcern の値のみです。

writeconcernの詳細な説明は公式ドキュメントをご覧ください。

本日は以上です。

以上、MongoDB mongoexportツールの使用について詳しく紹介しました。MongoDB mongoexportツールの使用についての詳しい情報は、スクリプトハウスの他の関連記事にも注目してください