Ubuntu14.04でMongoDBデータベースをインポートおよびエクスポートする方法
MongoDBは、最も人気のあるNoSQLデータベースエンジンの1つです。 スケーラブルで、強力で、信頼性が高く、使いやすいことで有名です。 この記事では、MongoDBデータベースをインポートおよびエクスポートする方法を紹介します。
この記事でのインポートとエクスポートとは、他のソフトウェア製品と互換性のある、人間が読める形式のデータを扱うことを意味することを明確にする必要があります。 対照的に、バックアップと復元の操作では、MongoDB固有のバイナリデータが作成または使用されます。これにより、データの整合性と整合性だけでなく、特定のMongoDB属性も保持されます。 したがって、移行の場合、ソースシステムとターゲットシステムに互換性がある限り、通常はバックアップと復元を使用することをお勧めします。 バックアップ、復元、および移行は、この記事の範囲を超えています— Ubuntu 14.04でMongoDBデータベースをバックアップ、復元、および移行する方法を参照してください。
前提条件
このチュートリアルを実行する前に、次の前提条件を満たしていることを確認してください。
- Ubuntu14.04ドロップレット
- root以外のsudoユーザー。 詳細については、 Ubuntu14.04を使用した初期サーバーセットアップを確認してください。
- 記事Ubuntu14.04にMongoDBをインストールする方法を使用してインストールおよび構成されたMongoDB。
特に明記されていない限り、このチュートリアルでroot権限を必要とするすべてのコマンドは、sudo権限を持つroot以外のユーザーとして実行する必要があります。
基本を理解する
この記事を続ける前に、この問題に関する基本的な理解が必要です。 MySQLなどの一般的なリレーショナルデータベースシステムの経験がある場合は、MongoDBを使用するときにいくつかの類似点が見つかる可能性があります。
最初に知っておくべきことは、MongoDBが情報を格納するために json およびbson(バイナリjson)形式を使用することです。 Jsonは人間が読める形式であり、データのエクスポート、そして最終的にはインポートに最適です。 シンプルなテキストエディターなど、jsonをサポートする任意のツールを使用して、エクスポートしたデータをさらに管理できます。
jsonドキュメントの例は次のようになります。
{"address":[
{"building":"1007", "street":"Park Ave"},
{"building":"1008", "street":"New Ave"},
]}
Jsonは非常に便利ですが、bsonで使用できるすべてのデータ型をサポートしているわけではありません。 これは、jsonを使用すると、情報のいわゆる「忠実度の低下」が発生することを意味します。 そのため、バックアップ/復元には、MongoDBデータベースをより適切に復元できるバイナリbsonを使用することをお勧めします。
次に、MongoDBデータベースを明示的に作成することを心配する必要はありません。 インポート用に指定したデータベースがまだ存在しない場合は、自動的に作成されます。 コレクション(データベーステーブル)構造の場合はさらに優れています。 他のデータベースエンジンとは対照的に、MongoDBでは、最初のドキュメント(データベース行)の挿入時に構造が再び自動的に作成されます。
第3に、MongoDBでは、この記事のタスクなどで大量のデータを読み取ったり挿入したりすると、リソースを大量に消費し、CPU、メモリ、およびディスク領域の多くを消費する可能性があります。 MongoDBが大規模なデータベースやビッグデータに頻繁に使用されることを考えると、これは重要なことです。 この問題の最も簡単な解決策は、夜間にエクスポート/バックアップを実行することです。
第4に、データベースのエクスポートプロセス中に情報が変更されるビジーなMongoDBサーバーがある場合、情報の一貫性が問題になる可能性があります。 この問題に対する簡単な解決策はありませんが、この記事の最後に、レプリケーションについてさらに読むための推奨事項が表示されます。
MongoDBへの情報のインポート
MongoDBへの情報のインポートがどのように機能するかを学ぶために、レストランに関する人気のあるサンプルMongoDBデータベースを使用してみましょう。 これは.json形式であり、次のようにwget
を使用してダウンロードできます。
- wget https://raw.githubusercontent.com/mongodb/docs-assets/primer-dataset/primer-dataset.json
ダウンロードが完了すると、現在のディレクトリにprimer-dataset.json
(12 MBサイズ)というファイルが作成されます。 このファイルからnewdb
という新しいデータベースとrestaurants
というコレクションにデータをインポートしてみましょう。 インポートには、次のようなコマンドmongoimport
を使用します。
- sudo mongoimport --db newdb --collection restaurants --file primer-dataset.json
結果は次のようになります。
2016-01-17T14:27:04.806-0500 connected to: localhost
2016-01-17T14:27:07.315-0500 imported 25359 documents
上記のコマンドが示すように、25359個のドキュメントがインポートされました。 newdb
というデータベースがなかったため、MongoDBが自動的に作成しました。
次のようにnewdb
という新しく作成されたMongoDBデータベースに接続して、インポートを確認しましょう。
- sudo mongo newdb
これで、新しく作成されたnewdb
データベースインスタンスに接続されました。 プロンプトが変更され、データベースに接続していることを示していることに注意してください。
次のコマンドを使用して、レストランコレクション内のドキュメントをカウントします。
- db.restaurants.count()
結果は、インポートされたドキュメントの正確な数である25359
と表示されます。 さらに良いチェックのために、次のようなレストランコレクションから最初のドキュメントを選択できます。
- db.restaurants.findOne()
結果は次のようになります。
{
"_id" : ObjectId("569beb098106480d3ed99926"),
"address" : {
"building" : "1007",
"coord" : [
-73.856077,
40.848447
],
"street" : "Morris Park Ave",
"zipcode" : "10462"
},
"borough" : "Bronx",
"cuisine" : "Bakery",
"grades" : [
{
"date" : ISODate("2014-03-03T00:00:00Z"),
"grade" : "A",
"score" : 2
},
...
],
"name" : "Morris Park Bake Shop",
"restaurant_id" : "30075445"
}
このような詳細なチェックにより、コンテンツ、エンコーディングなどのドキュメントの問題が明らかになる可能性があります。 json形式はUTF-8
エンコーディングを使用し、エクスポートとインポートはそのエンコーディングである必要があります。 jsonファイルを手動で編集する場合は、このことに注意してください。 それ以外の場合は、MongoDBが自動的に処理します。
MongoDBプロンプトを終了するには、プロンプトでexit
と入力します。
- exit
root以外のユーザーとして、通常のコマンドラインプロンプトに戻ります。
MongoDBからの情報のエクスポート
前述したように、MongoDB情報をエクスポートすることで、データを含む人間が読めるテキストファイルを取得できます。 デフォルトでは、情報はjson形式でエクスポートされますが、csv(カンマ区切り値)にエクスポートすることもできます。
MongoDBから情報をエクスポートするには、コマンドmongoexport
を使用します。 これにより、非常にきめ細かいエクスポートをエクスポートできるため、データベース、コレクション、フィールドを指定したり、エクスポートにクエリを使用したりすることもできます。
簡単なmongoexport
の例は、以前にインポートしたnewdb
データベースからレストランコレクションをエクスポートすることです。 これは次のように実行できます。
- sudo mongoexport --db newdb -c restaurants --out newdbexport.json
上記のコマンドでは、--db
を使用してデータベースを指定し、-c
をコレクションに使用し、--out
を使用してデータを保存するファイルを指定します。
成功したmongoexport
の出力は、次のようになります。
2016-01-20T03:39:00.143-0500 connected to: localhost
2016-01-20T03:39:03.145-0500 exported 25359 records
上記の出力は、25359個のドキュメントがインポートされたことを示しています。これは、インポートされたドキュメントと同じ数です。
場合によっては、コレクションの一部のみをエクスポートする必要があります。 レストランのjsonファイルの構造と内容を考慮して、ブロンクス区に位置し、中華料理を提供するという基準を満たすすべてのレストランをエクスポートしてみましょう。 MongoDBに接続しているときにこの情報を直接取得する場合は、データベースに再度接続します。
- sudo mongo newdb
次に、次のクエリを使用します。
db.restaurants.find( { borough: "Bronx", cuisine: "Chinese" } )
結果は端末に表示されます。 MongoDBプロンプトを終了するには、プロンプトでexit
と入力します。
- exit
データベースに接続しているときではなく、sudoコマンドラインからデータをエクスポートする場合は、次のように-q
引数に指定して、mongoexport
コマンドの前のクエリ部分を作成します。
- sudo mongoexport --db newdb -c restaurants -q "{ borough: 'Bronx', cuisine: 'Chinese' }" --out Bronx_Chinese_retaurants.json
クエリ条件には、二重引用符内で一重引用符を使用していることに注意してください。 二重引用符または$
のような特殊文字を使用する場合は、クエリで円記号(\
)を使用してそれらをエスケープする必要があります。
エクスポートが成功した場合、結果は次のようになります。
2016-01-20T04:16:28.381-0500 connected to: localhost
2016-01-20T04:16:28.461-0500 exported 323 records
上記は323レコードがエクスポートされたことを示しており、指定したBronx_Chinese_retaurants.json
ファイルで見つけることができます。
結論
この記事では、MongoDBデータベースとの間で情報をインポートおよびエクスポートするための基本事項を紹介しました。 Ubuntu 14.04でMongoDBデータベースをバックアップ、復元、移行する方法およびスケーラブルなMongoDBデータベースをセットアップする方法を引き続き読むことができます。
レプリケーションはスケーラビリティに役立つだけでなく、現在のトピックにとっても重要です。 レプリケーションを使用すると、障害からマスターサーバーを復元している間、スレーブMongoDBサーバーから中断されることなくMongoDBサービスを実行し続けることができます。 レプリケーションの一部は、操作ログ(oplog)でもあり、データを変更するすべての操作を記録します。 MySQLのバイナリログを使用するのと同じように、このログを使用して、最後のバックアップが行われた後にデータを復元できます。 バックアップは通常夜間に行われることを思い出してください。夕方にバックアップを復元する場合は、最後のバックアップ以降のすべての更新が失われます。