MongoDBサーバのimport操作とexport操作をまとめます。CLIを使用する場合は、mongoimportとmongoexportを使用します。また、MongoDB CompassのようなGUIツールもimport機能とexport機能を備えています。
前提
公式ドキュメント
参考になる公式ドキュメントを以下に示します。
動作確認済環境
- Rocky Linux 8.6
- MongoDB Server 6.0.2
CLI操作
接続文字列
MongoDBへ接続する場合は、MongoDBへの接続情報をURIで指定します。認証が不要な場合の書式が以下の通りです。
mongodb://<MongoDBサーバ IPアドレス>:<MongoDBサーバ ポート番号>/<データベース名>
認証が必要な場合は以下のように指定します。
mongodb://<ユーザ名>:<パスワード>@<MongoDBサーバ IPアドレス>:<MongoDBサーバ ポート番号>/<データベース名>
mongoimport
コマンドラインでMongoDBサーバへのインポートをする場合は、mongoimportというツールを使用します。RPMパッケージmongodb-orgをインストールすると、自動的にmongoimportもインストールされます。
jsonインポート
jsonファイルをインポートする場合の操作例を示します。まずはテスト用のJSONファイルを作成します。なお、mongoimportが読み込むファイルはUTF-8である事を前提としている事に注意ください。
cat << 'EOF' > import.json { "item": "journal", "qty": 25, "size": { "h": 14, "w": 21, "uom": "cm" }, "status": "A" } { "item": "notebook", "qty": 50, "size": { "h": 8.5, "w": 11, "uom": "in" }, "status": "A" } { "item": "notebook", "qty": 50, "size": { "h": 8.5, "w": 11, "uom": "in" }, "status": "A" } { "item": "paper", "qty": 100, "size": { "h": 8.5, "w": 11, "uom": "in" }, "status": "D" } { "item": "planner", "qty": 75, "size": { "h": 22.85, "w": 30, "uom": "cm" }, "status": "D" } { "item": "postcard", "qty": 45, "size": { "h": 10, "w": 15.25, "uom": "cm" }, "status": "A" } EOF
mongoimportを用いたインポートをする操作例は以下の通りです。引数の意味は直感的に分かると思いますので説明を省略します(直感に頼りたくない場合は「mongoimport」を参照ください)。
mongoimport \ --type=json \ --file=import.json \ --collection=inventory \ mongodb://172.16.1.90:27017/test
想定通りのデータがimportされた事を確認します。
[root@linux090 ~]# mongosh --quiet [direct: mongos] test> db.inventory.find(); [ { _id: ObjectId("63581f0d18e6eea873a2b750"), item: 'journal', qty: 25, size: { h: 14, w: 21, uom: 'cm' }, status: 'A' }, { _id: ObjectId("63581f0d18e6eea873a2b754"), item: 'postcard', qty: 45, size: { h: 10, w: 15.25, uom: 'cm' }, status: 'A' }, { _id: ObjectId("63581f0d18e6eea873a2b751"), item: 'notebook', qty: 50, size: { h: 8.5, w: 11, uom: 'in' }, status: 'A' }, { _id: ObjectId("63581f0d18e6eea873a2b752"), item: 'paper', qty: 100, size: { h: 8.5, w: 11, uom: 'in' }, status: 'D' }, { _id: ObjectId("63581f0d18e6eea873a2b753"), item: 'planner', qty: 75, size: { h: 22.85, w: 30, uom: 'cm' }, status: 'D' } ] [direct: mongos] test>
csvインポート
mongodbはcsvインポートも可能です。ただし、csvはフィールド名を含まないフォーマットですので、フィールド名指定の配慮が必要です。
mongoimportコマンドは以下のようなオプションを指定する事でフィールド名を定義できます。
オプション | 意味 |
---|---|
–fields | コマンドラインでフィールド名を指定する |
–fieldFile | |
–headerline | csvファイルの先頭行にフィールド名を指定する |
以下にオプションheaderlineにフィールド名を指定する操作例を示します。以下にテストデータの例を挙げます。
cat << 'EOF' > import.csv _id,prefecture,description 11,埼玉,未入力 12,千葉,未入力 13,東京,未入力 14,神奈川,未入力 EOF
mongodbがインポートできるcsvはRFC4180に基づいたフォーマットを許容します。RFC4180とは、誤解を恐れずにざっくりとした言い方をすれば、Excelのcsvデータのように改行を許容するフォーマットです。以下にRFC4180の例を紹介します。
cat << 'EOF' > import.csv _id,prefecture,description 11,埼玉,"未開の地。 通るには通行手形が必要" 12,千葉,未入力 13,東京,未入力 14,神奈川,未入力 EOF
mongoimportを用いたインポートをする操作例は以下の通りです。
mongoimport \ --type=csv \ --file=import.csv \ --headerline \ --collection=prefecture \ mongodb://172.16.1.90:27017/test
想定通りのデータがimportされた事を確認します。
[root@linux090 ~]# mongosh --quiet [direct: mongos] test> db.prefecture.find() [ { _id: 11, prefecture: '埼玉', description: '未開の地。\n通るには通行手形が必要' }, { _id: 12, prefecture: '千葉', description: '未入力' }, { _id: 13, prefecture: '東京', description: '未入力' }, { _id: 14, prefecture: '神奈川', description: '未入力' } ] [direct: mongos] test>
mongoexport
コマンドラインでMongoDBサーバからのエクスポートをする場合は、mongoexportというツールを使用します。RPMパッケージmongodb-orgをインストールすると、自動的にmongoexportもインストールされます。
jsonエクスポート
mongoexportに与える引数は、mongoimportとほぼ同じです。以下のような操作でtestデータベースのinventoryコレクションをエクスポートする事ができます。
mongoexport \ --type=json \ --collection=inventory \ mongodb://172.16.1.90:27017/test
操作のログは以下の通りです。エクスポートされたデータ以外にもログも表示されています。
[root@linux090 ~]# mongoexport \ > --type=json \ > --collection=inventory \ > mongodb://172.16.1.90:27017/test 2022-10-27T22:58:39.988+0900 connected to: mongodb://172.16.1.90:27017/test {"_id":{"$oid":"63581f0d18e6eea873a2b751"},"item":"notebook","qty":50,"size":{"h":8.5,"w":11,"uom":"in"},"status":"A"} {"_id":{"$oid":"63581f0d18e6eea873a2b752"},"item":"paper","qty":100,"size":{"h":8.5,"w":11,"uom":"in"},"status":"D"} {"_id":{"$oid":"63581f0d18e6eea873a2b753"},"item":"planner","qty":75,"size":{"h":22.85,"w":30,"uom":"cm"},"status":"D"} {"_id":{"$oid":"63581f0d18e6eea873a2b750"},"item":"journal","qty":25,"size":{"h":14,"w":21,"uom":"cm"},"status":"A"} {"_id":{"$oid":"63581f0d18e6eea873a2b754"},"item":"postcard","qty":45,"size":{"h":10,"w":15.25,"uom":"cm"},"status":"A"} 2022-10-27T22:58:40.028+0900 exported 5 records [root@linux090 ~]#
この出力はデータが標準出力でログがエラー出力です。ですので、以下のように標準出力のみを抽出するようにすれば、エクスポートされたデータをファイルに記録する事ができます。
[root@linux090 ~]# mongoexport \ > --type=json \ > --collection=inventory \ > mongodb://172.16.1.90:27017/test > export.json 2022-10-27T23:00:48.391+0900 connected to: mongodb://172.16.1.90:27017/test 2022-10-27T23:00:48.412+0900 exported 5 records [root@linux090 ~]# cat export.json {"_id":{"$oid":"63581f0d18e6eea873a2b751"},"item":"notebook","qty":50,"size":{"h":8.5,"w":11,"uom":"in"},"status":"A"} {"_id":{"$oid":"63581f0d18e6eea873a2b752"},"item":"paper","qty":100,"size":{"h":8.5,"w":11,"uom":"in"},"status":"D"} {"_id":{"$oid":"63581f0d18e6eea873a2b753"},"item":"planner","qty":75,"size":{"h":22.85,"w":30,"uom":"cm"},"status":"D"} {"_id":{"$oid":"63581f0d18e6eea873a2b750"},"item":"journal","qty":25,"size":{"h":14,"w":21,"uom":"cm"},"status":"A"} {"_id":{"$oid":"63581f0d18e6eea873a2b754"},"item":"postcard","qty":45,"size":{"h":10,"w":15.25,"uom":"cm"},"status":"A"} [root@linux090 ~]#
mongoexportはqueryオプションを指定する事で対象を絞り込む事ができます。
$ltをダブルクォート等で囲む必要があるなど、操作には癖があります。
mongoexport \ --type=json \ --collection=inventory \ --query='{ "qty" : { "$lt" : 50 } }' \ mongodb://172.16.1.90:27017/test
操作ログは以下の通りです。
[root@linux090 ~]# mongoexport \ > --type=json \ > --collection=inventory \ > --query='{ "qty" : { "$lt" : 50 } }' \ > mongodb://172.16.1.90:27017/test 2022-10-27T23:09:55.538+0900 connected to: mongodb://172.16.1.90:27017/test {"_id":{"$oid":"63581f0d18e6eea873a2b750"},"item":"journal","qty":25,"size":{"h":14,"w":21,"uom":"cm"},"status":"A"} {"_id":{"$oid":"63581f0d18e6eea873a2b754"},"item":"postcard","qty":45,"size":{"h":10,"w":15.25,"uom":"cm"},"status":"A"} 2022-10-27T23:09:55.557+0900 exported 2 records [root@linux090 ~]#
csvエクスポート
csvエクスポートの操作例は以下の通りです。csvでエクスポートする場合は、fieldsオプションでフィールド名の指定が必要です。
mongoexport \ --type=csv \ --collection=prefecture \ --fields='_id,prefecture,description' \ mongodb://172.16.1.90:27017/test
操作ログは以下の通りです。
[root@linux090 ~]# mongoexport \ > --type=csv \ > --collection=prefecture \ > --fields='_id,prefecture,description' \ > mongodb://172.16.1.90:27017/test 2022-10-27T23:14:27.763+0900 connected to: mongodb://172.16.1.90:27017/test _id,prefecture,description 11,埼玉,"未開の地。 通るには通行手形が必要" 12,千葉,未入力 13,東京,未入力 14,神奈川,未入力 2022-10-27T23:14:27.780+0900 exported 4 records [root@linux090 ~]#
GUI(MongoDB Compass)操作
import
jsonインポート
まずはテスト用のデータを作成します。以下の内容が記述されたファイルを任意のファイル名(例:import.json)で保存します。
{ "type": "home", "number": "212-555-1234" } { "type": "cell", "number": "646-555-4567" } { "type": "office", "number": "202-555-0182"}
「操作対象のデータベース名(test)」「Create Collection」の順に画面遷移し、コレクション名入力後に「Create Collection」を押下します。
操作対象のcollection画面で、「ADD DATA」「Import File」の順に押下します。
「Select File」欄でインポート対象のjsonファイルを指定し、「Select Input File Type」は「JSON」とします。以上の操作完了後、「IMPORT」を押下します。
想定通りのデータがインポートされた事を確認します。
csvインポート
まずはテスト用のデータを作成します。以下の内容が記述されたファイルを任意のファイル名(例:import.csv)で保存します。先頭行は必ずフィールド名にしなければならない制約がある事に注意ください。
_id,ename,job,mgr,hiredate,sal,comm,deptno 7369,SMITH,CLERK,7902,17-DEC-80,800,,20 7499,ALLEN,SALESMAN,7698,20-FEB-81,1600,300,30 7521,WARD,SALESMAN,7698,22-FEB-81,1250,500,30 7566,JONES,MANAGER,7839,02-APR-81,2975,,20 7654,MARTIN,SALESMAN,7698,28-SEP-81,1250,1400,30 7698,BLAKE,MANAGER,7839,01-MAY-81,2850,,30 7782,CLARK,MANAGER,7839,09-JUN-81,2450,,10 7788,SCOTT,ANALYST,7566,19-APR-87,3000,,20 7839,KING,PRESIDENT,,17-NOV-81,5000,,10 7844,TURNER,SALESMAN,7698,08-SEP-81,1500,0,30 7876,ADAMS,CLERK,7788,23-MAY-87,1100,,20 7900,JAMES,CLERK,7698,03-DEC-81,950,,30 7902,FORD,ANALYST,7566,03-DEC-81,3000,,20 7934,MILLER,CLERK,7782,23-JAN-82,1300,,10
「操作対象のデータベース名(test)」「Create Collection」の順に画面遷移し、コレクション名入力後に「Create Collection」を押下します。
操作対象のcollection画面で、「ADD DATA」「Import File」の順に押下します。
「Select File」欄でインポート対象のcsvファイルを指定し、「Select Input File Type」は「CSV」とします。
コマンドラインツールのmongoimportと異なり、MongoDB Compassは各フィールドのデータ型の指定が可能です。必要に応じてデータ型を変更します。以下スクリーンショットの例では、sal(給与)フィールドをstring型からDecimal128型に変更しています。
以上の操作完了後、「IMPORT」を押下します。
想定通りのデータがインポートされた事を確認します。
export
jsonエクスポート
「データベース名(例:test)」「コレクション名(例:employee)」の順に押下し、コレクション画面へ遷移します。
もし、全量ではなく一部データをエクスポートしたい場合は、FILTER欄に以下の例のような検索条件を入力します。
{sal:{$gt:2500}}
以上の操作完了後、「Collection」「Export Collection」の順に押下します。
「Export query with filter」を選んだ場合は、前述のFILTER欄に基づいたデータが出力されます。一方、「Export Full Collection」を選んだ場合は、全量が出力されます。選択完了後、「SELECT FIELDS」を押下します。
「Select Fields」欄で出力するフィールドを絞り込む事ができます。絞り込み完了後、「SELECT OUTPUT」を押下します。
「Select Input File Type」欄は「JSON」とし、「Output」に出力先のファイル名を指定します。。以上の操作完了後、「EXPORT」を押下します。
想定通りのデータがエクスポートされた事を確認します。
csvエクスポート
「データベース名(例:test)」「コレクション名(例:employee)」の順に押下し、コレクション画面へ遷移します。
もし、全量ではなく一部データをエクスポートしたい場合は、FILTER欄に以下の例のような検索条件を入力します。
{sal:{$gt:2500}}
以上の操作完了後、「Collection」「Export Collection」の順に押下します。
「Export query with filter」を選んだ場合は、前述のFILTER欄に基づいたデータが出力されます。一方、「Export Full Collection」を選んだ場合は、全量が出力されます。選択完了後、「SELECT FIELDS」を押下します。
「Select Fields」欄で出力するフィールドを絞り込む事ができます。絞り込み完了後、「SELECT OUTPUT」を押下します。
「Select Input File Type」欄は「CSV」とし、「Output」に出力先のファイル名を指定します。。以上の操作完了後、「EXPORT」を押下します。
想定通りのデータがエクスポートされた事を確認します。