MongoDBは、最も人気のあるNoSQLデータベースエンジンの1つです。 拡張性があり、強力で、信頼性が高く、使いやすいことで有名です。 この記事では、MongoDBデータベースをインポートおよびエクスポートする方法を示します。

この記事のインポートおよびエクスポートとは、他のソフトウェア製品と互換性のある人間が読める形式のデータを扱うことを意味することを明確にする必要があります。 対照的に、バックアップおよび復元操作では、MongoDB固有のバイナリデータを作成または使用します。これにより、データの一貫性と整合性だけでなく、特定のMongoDB属性も保持されます。 したがって、移行には、ソースシステムとターゲットシステムに互換性がある限り、通常はバックアップと復元を使用することをお勧めします。 バックアップ、復元、移行はこの記事の範囲外です-https://www.digitalocean.com/community/tutorials/how-to-back-up-restore-and-migrate-a-mongodb-database-を参照してくださいon-ubuntu-14-04 [Ubuntu 14.04でMongoDBデータベースをバックアップ、復元、移行する方法]。

前提条件

このチュートリアルを実行する前に、次の前提条件を満たしていることを確認してください。

  • Ubuntu 14.04ドロップレット

  • 非ルートsudoユーザー。 詳細については、https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-14-04 [Ubuntu 14.04での初期サーバー設定]をご覧ください。

  • MongoDBは、記事https://www.digitalocean.com/community/tutorials/how-to-install-mongodb-on-ubuntu-14-04[Ubuntu 14.04にMongoDBをインストールする方法]を使用してインストールおよび構成しました。

特に断りのない限り、このチュートリアルでルート権限を必要とするすべてのコマンドは、sudo権限を持つ非ルートユーザーとして実行する必要があります。

基本を理解する

この記事をさらに続ける前に、この問題に関する基本的な理解が必要です。 MySQLなどの一般的なリレーショナルデータベースシステムの経験がある場合は、MongoDBを使用するときにいくつかの類似点が見つかることがあります。

最初に知っておくべきことは、MongoDBは情報を格納するためにhttp://json.org/[json]およびbson(バイナリjson)形式を使用することです。 Jsonは人間が読める形式であり、データのエクスポート、最終的にはインポートに最適です。 エクスポートされたデータは、シンプルなテキストエディターなど、jsonをサポートするツールでさらに管理できます。

JSONドキュメントの例は次のようになります。

JSON形式の例

{"address":[
   {"building":"1007", "street":"Park Ave"},
   {"building":"1008", "street":"New Ave"},
]}

Jsonは非常に便利ですが、bsonで使用できるすべてのデータ型をサポートしているわけではありません。 これは、jsonを使用する場合、情報のいわゆる「忠実性の喪失」があることを意味します。 そのため、バックアップ/復元には、MongoDBデータベースをより適切に復元できるバイナリbsonを使用することをお勧めします。

第二に、MongoDBデータベースを明示的に作成することを心配する必要はありません。 インポート用に指定したデータベースがまだ存在しない場合、自動的に作成されます。 さらに良いのは、コレクション(データベーステーブル)構造の場合です。 他のデータベースエンジンとは異なり、MongoDBでは、最初のドキュメント(データベース行)の挿入時に構造が再び自動的に作成されます。

第三に、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 in」(12 MBサイズ)というファイルが作成されます。 このファイルのデータを「+ newdb 」という新しいデータベースと「 restaurants 」というコレクションにインポートしましょう。 インポートには、次のようなコマンド「 mongoimport +」を使用します。

sudo mongoimport --db newdb --collection restaurants --file primer-dataset.json

結果は次のようになります。

mongoimportの出力

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()

結果は次のようになります。

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 +`の出力は次のようになります。

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

クエリ条件の二重引用符内で単一引用符を使用していることに注意してください。 二重引用符または + $ +`のような特殊文字を使用する場合、クエリ内でバックスラッシュ( `+ \ +)でエスケープする必要があります。

エクスポートが成功した場合、結果は次のようになります。

mongoexportの出力

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データベースとの間で情報をインポートおよびエクスポートするための重要事項を紹介しました。 How To Ubuntu 14.04でのMongoDBデータベースのバックアップ、復元、移行およびhttps://www.digitalocean.com/community/tutorials/how-to-set-up-a-scalable-mongodb-database [セットアップ方法スケーラブルなMongoDBデータベース]。

レプリケーションは、スケーラビリティに役立つだけでなく、現在のトピックにとっても重要です。 レプリケーションを使用すると、障害からマスターサーバーを復元している間、スレーブMongoDBサーバーから中断せずにMongoDBサービスを実行し続けることができます。 複製の一部はhttps://docs.mongodb.org/manual/core/replica-set-oplog/[operations log(oplog)]でもあり、これはデータを変更するすべての操作を記録します。 MySQLでバイナリログを使用するのと同じように、このログを使用して、最後のバックアップが行われた後にデータを復元できます。 通常、バックアップは夜間に行われることを思い出してください。夜間にバックアップを復元することにした場合、最後のバックアップ以降のすべての更新が失われます。