MongoDB データのエクスポート

MongoDBBeginner
オンラインで実践に進む

はじめに

この実験 (Lab) では、MongoDB データベースからデータをエクスポートするために mongoexport コマンドラインユーティリティを使用する方法を学びます。JSON と CSV という 2 つの一般的な形式でデータをエクスポートする練習を行います。この実験では、サンプルデータセットの作成、コレクション全体のデータのエクスポート、エクスポートするフィールドの選択、およびエクスポートするデータをフィルタリングするためのクエリの使用方法を順を追って説明します。この実験が終わる頃には、バックアップ、分析、または他のシステムへの移行のために MongoDB からデータを抽出することに習熟しているでしょう。

コレクションを JSON にエクスポートする

最初のステップでは、MongoDB コレクションを JSON ファイルにエクスポートする基本的なプロセスを学びます。JSON (JavaScript Object Notation) は、MongoDB ドキュメントの豊富なネスト構造を保持する標準形式であり、バックアップや移行に最適です。

まず、MongoDB サーバーに接続し、サンプルデータをいくつか作成する必要があります。ターミナルで次のコマンドを実行して、MongoDB Shell を開きます。

mongosh

MongoDB Shell 内に入ると、新しいプロンプトが表示されます。次に、exportlab という名前の新しいデータベースを作成して切り替え、users コレクションに 3 つのドキュメントを挿入します。

use exportlab
db.users.insertMany([
  { name: "Alice", age: 28, email: "alice@example.com", status: "active" },
  { name: "Bob", age: 35, email: "bob@example.com", status: "active" },
  { name: "Charlie", age: 42, email: "charlie@example.com", status: "inactive" }
]);

ドキュメントが挿入された後、確認メッセージが表示されます。次に、MongoDB Shell を終了して通常のターミナルに戻ります。

exit;

データが準備できたので、mongoexport ユーティリティを使用して users コレクションをエクスポートできます。このコマンドは、データベース、コレクション、および出力ファイルを指定します。

mongoexport --db=exportlab --collection=users --out=$HOME/project/users.json
  • --db: 接続するデータベースを指定します (exportlab)。
  • --collection: エクスポートするコレクションを指定します (users)。
  • --out: 出力ファイルのパスとファイル名を指定します ($HOME/project/users.json)。

エクスポートが成功したことを確認するには、新しく作成された JSON ファイルの内容を表示します。

cat ~/project/users.json

挿入した 3 つのドキュメントが、それぞれ新しい行に JSON 形式で表示されます。この形式は JSONL (JSON Lines) と呼ばれ、各行には個別の完全な JSON オブジェクトが含まれています。MongoDB は各ドキュメントに一意の _id フィールドを追加することに注意してください。

{"_id":{"$oid":"656f1a6b..."},"name":"Alice","age":28,"email":"alice@example.com","status":"active"}
{"_id":{"$oid":"656f1a6b..."},"name":"Bob","age":35,"email":"bob@example.com","status":"active"}
{"_id":{"$oid":"656f1a6b..."},"name":"Charlie","age":42,"email":"charlie@example.com","status":"inactive"}

コレクションを CSV にエクスポートする

JSON はデータの構造を保持するのに優れていますが、CSV (Comma-Separated Values) はスプレッドシートでの使用や単純なデータ交換に便利な場合が多くあります。このステップでは、同じ users コレクションを CSV ファイルにエクスポートします。

CSV にエクスポートする場合、含めるフィールドを指定する必要があります。これは、CSV がフラットな表形式であり、ネストされた JSON 構造を表現できないためです。

再度 mongoexport コマンドを使用しますが、今回は --type=csv および --fields オプションを追加します。nameageemail フィールドをエクスポートします。

mongoexport --db=exportlab --collection=users --type=csv --fields=name,age,email --out=$HOME/project/users.csv
  • --type=csv: このフラグは、mongoexport に CSV 形式で出力するように指示します。
  • --fields: エクスポートに含めるフィールドのカンマ区切りリストです。ここにリストする順序が、CSV ファイルの列の順序を決定します。

次に、users.csv ファイルの内容を確認します。

cat ~/project/users.csv

出力は標準的な CSV 形式になり、フィールド名がヘッダー行として表示され、その後にデータが続きます。

name,age,email
Alice,28,alice@example.com
Bob,35,bob@example.com
Charlie,42,charlie@example.com

これで、同じデータを 2 つの異なる形式に正常にエクスポートできました。

クエリを使用したデータのフィルタリング

多くの場合、コレクション全体をエクスポートする必要はありません。mongoexport では、クエリを使用してエクスポートするドキュメントをフィルタリングできます。これは、データの特定のサブセットを抽出する場合に便利です。

このステップでは、status が「active」であるユーザーのみをエクスポートします。--query オプションは、MongoDB Shell の find() 操作と同様に、フィルター条件を指定する JSON ドキュメントを受け入れます。

次のコマンドを実行して、アクティブなユーザーのみを active_users.json という名前の新しい JSON ファイルにエクスポートします。

mongoexport --db=exportlab --collection=users --query='{"status": "active"}' --out=$HOME/project/active_users.json
  • --query='{"status": "active"}': このオプションはドキュメントをフィルタリングし、status フィールドが "active" と等しいドキュメントのみをエクスポートします。シェルでの解釈の問題を防ぐために、JSON 文字列を単一引用符で囲んでいることに注意してください。

エクスポートされたファイルの内容を確認しましょう。

cat ~/project/active_users.json

Charlie のステータスは「inactive」であるため、出力には Alice と Bob のドキュメントのみが含まれるはずです。

{"_id":{"$oid":"656f1a6b..."},"name":"Alice","age":28,"email":"alice@example.com","status":"active"}
{"_id":{"$oid":"656f1a6b..."},"name":"Bob","age":35,"email":"bob@example.com","status":"active"}

このフィルタリング機能は、データがエクスポートされた後にデータを操作する必要なく、ターゲットを絞ったデータエクスポートを作成するのに強力です。

出力のフォーマットと制限

mongoexport には、エクスポートするデータのフォーマットと量を制御するための追加オプションがあります。このステップでは、より人間が読める「pretty」な JSON 出力の作成方法と、エクスポートするドキュメント数を制限する方法を学びます。

まず、users コレクションを再度エクスポートしますが、今回は --pretty フラグを使用します。これにより、JSON 出力がインデントと改行でフォーマットされ、読みやすさが大幅に向上します。

mongoexport --db=exportlab --collection=users --pretty --out=$HOME/project/users_pretty.json
  • --pretty: 出力される JSON を人間が読める形式にフォーマットします。

フォーマットされたファイルを表示して違いを確認します。

cat ~/project/users_pretty.json

出力は次のようにきれいにインデントされます。

[
  {
    "_id": {
      "$oid": "656f1a6b..."
    },
    "name": "Alice",
    "age": 28,
    "email": "alice@example.com",
    "status": "active"
  },
  {
    "_id": {
      "$oid": "656f1a6b..."
    },
    "name": "Bob",
    "age": 35,
    "email": "bob@example.com",
    "status": "active"
  },
  {
    "_id": {
      "$oid": "656f1a6b..."
    },
    "name": "Charlie",
    "age": 42,
    "email": "charlie@example.com",
    "status": "inactive"
  }
]

次に、--limit オプションを使用して、特定の数のドキュメントのみをエクスポートします。これは、小さなサンプルファイルを作成したり、テストしたりする場合に便利です。最初の 2 つのドキュメントのみを CSV ファイルにエクスポートしましょう。

mongoexport --db=exportlab --collection=users --type=csv --fields=name,status --limit=2 --out=$HOME/project/users_limited.csv
  • --limit=2: エクスポートを最大 2 つのドキュメントに制限します。

制限された CSV ファイルの内容を確認します。

cat ~/project/users_limited.csv

予想どおり、ファイルにはヘッダーと最初の 2 つのユーザーレコードのみが含まれています。

name,status
Alice,active
Bob,active

エクスポートされたファイルの検証

この最後のステップでは、作成したファイルを検査および検証するために、一般的な Linux コマンドラインツールを使用する練習をします。これは、データエクスポートの整合性を確認するための重要なスキルです。

まず、プロジェクトディレクトリ内のすべてのファイルを表示して、作成したすべてのものを確認します。-lh フラグは、人間が読める形式で詳細を表示します。

ls -lh ~/project/

前のステップで作成したすべての .json および .csv ファイルが表示されるはずです。

total 20K
-rw-rw-r-- 1 labex labex 224 Aug 27 15:48  active_users.json
-rw-rw-r-- 1 labex labex  96 Aug 27 15:48  users.csv
-rw-rw-r-- 1 labex labex 344 Aug 27 15:36  users.json
-rw-rw-r-- 1 labex labex  36 Aug 27 15:48  users_limited.csv
-rw-rw-r-- 1 labex labex 410 Aug 27 15:48  users_pretty.json

次に、wc -l コマンドを使用してファイルの行数をカウントします。これは、エクスポートされたドキュメント数を確認する簡単な方法です。

wc -l ~/project/*.json ~/project/*.csv

各ドキュメントが 1 行にある JSON ファイルの場合、行数はドキュメント数と等しくなります。CSV ファイルの場合、行数はデータ行数にヘッダー用の 1 行を加えた数になります。

  2 /home/labex/project/active_users.json
  3 /home/labex/project/users.json
27 /home/labex/project/users_pretty.json
  4 /home/labex/project/users.csv
  3 /home/labex/project/users_limited.csv
39 total

最後に、JSON ファイルの構文を検証できます。mongoexport はデフォルトで JSONL (JSON Lines) フォーマットを作成することに注意してください。これは、各ドキュメントが独自の行にある個別の JSON オブジェクトであることを意味します。このフォーマットを検証するには、各行を個別に確認できます。

while IFS= read -r line; do
  echo "$line" | python3 -m json.tool > /dev/null
done < ~/project/users.json && echo "All JSON lines are valid"

コマンドがエラーなく実行された場合、JSON ファイルは有効です。これらの検証技術は、データエクスポートが完全で正しいことを保証するのに役立ちます。

まとめ

この実験では、mongoexportユーティリティの基本的な機能について学びました。まずサンプルデータセットを作成し、JSON ファイルへの基本的なエクスポートを実行しました。次に、同じデータを CSV ファイルにエクスポートし、表形式フォーマットのためのフィールドを指定する方法を--fieldsで学びました。また、--queryオプションを使用してデータをフィルタリングし、特定のサブセットのドキュメントのみをエクスポートする練習をしました。最後に、人間が読める JSON のための--prettyや、エクスポートされるレコード数を制御するための--limitのようなフォーマットオプションを探求しました。これらの演習を通じて、さまざまな目的のために MongoDB からデータを抽出するための実践的なスキルを習得しました。