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」を押下します。

想定通りのデータがエクスポートされた事を確認します。

  
  
  
  