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ドキュメントの例は次のようになります。

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を使用してダウンロードできます。

  1. wget https://raw.githubusercontent.com/mongodb/docs-assets/primer-dataset/primer-dataset.json

ダウンロードが完了すると、現在のディレクトリにprimer-dataset.json(12 MBサイズ)というファイルが作成されます。 このファイルからnewdbという新しいデータベースとrestaurantsというコレクションにデータをインポートしてみましょう。 インポートには、次のようなコマンドmongoimportを使用します。

  1. 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データベースに接続して、インポートを確認しましょう。

  1. sudo mongo newdb

これで、新しく作成されたnewdbデータベースインスタンスに接続されました。 プロンプトが変更され、データベースに接続していることを示していることに注意してください。

次のコマンドを使用して、レストランコレクション内のドキュメントをカウントします。

  1. db.restaurants.count()

結果は、インポートされたドキュメントの正確な数である25359と表示されます。 さらに良いチェックのために、次のようなレストランコレクションから最初のドキュメントを選択できます。

  1. 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と入力します。

  1. exit

root以外のユーザーとして、通常のコマンドラインプロンプトに戻ります。

MongoDBからの情報のエクスポート

前述したように、MongoDB情報をエクスポートすることで、データを含む人間が読めるテキストファイルを取得できます。 デフォルトでは、情報はjson形式でエクスポートされますが、csv(カンマ区切り値)にエクスポートすることもできます。

MongoDBから情報をエクスポートするには、コマンドmongoexportを使用します。 これにより、非常にきめ細かいエクスポートをエクスポートできるため、データベース、コレクション、フィールドを指定したり、エクスポートにクエリを使用したりすることもできます。

簡単なmongoexportの例は、以前にインポートしたnewdbデータベースからレストランコレクションをエクスポートすることです。 これは次のように実行できます。

  1. 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に接続しているときにこの情報を直接取得する場合は、データベースに再度接続します。

  1. sudo mongo newdb

次に、次のクエリを使用します。

db.restaurants.find( { borough: "Bronx", cuisine: "Chinese" } )

結果は端末に表示されます。 MongoDBプロンプトを終了するには、プロンプトでexitと入力します。

  1. exit

データベースに接続しているときではなく、sudoコマンドラインからデータをエクスポートする場合は、次のように-q引数に指定して、mongoexportコマンドの前のクエリ部分を作成します。

  1. 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データベースとの間で情報をインポートおよびエクスポートするための基本事項を紹介しました。 Ubuntu 14.04でMongoDBデータベースをバックアップ、復元、移行する方法およびスケーラブルなMongoDBデータベースをセットアップする方法を引き続き読むことができます。

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