著者はCOVID-19救済基金を選択し、 Write forDOnationsプログラムの一環として寄付を受け取りました。

序章

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

インポートとエクスポートとは、他のソフトウェア製品と互換性のある、人間が読める形式のデータを処理する操作を意味することを明確にする必要があります。 対照的に、バックアップと復元の操作では、MongoDB固有のバイナリデータが作成または使用されます。これにより、データとその特定のMongoDB属性の整合性と整合性が維持されます。 したがって、移行の場合、ソースシステムとターゲットシステムに互換性がある限り、通常はバックアップと復元を使用することをお勧めします。

バックアップ、復元、および移行のタスクは、この記事の範囲を超えています。 詳細については、 Ubuntu 20.04 でMongoDBデータベースをバックアップ、復元、および移行する方法を参照してください。

前提条件

このチュートリアルを完了するには、次のものが必要です。

ステップ1—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

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

Output
2020-11-11T19:37:55.607+0000 connected to: mongodb://localhost/ 2020-11-11T19:37:57.841+0000 25359 document(s) imported successfully. 0 document(s) failed to import

上記のコマンドが示すように、25359個のドキュメントがインポートされました。 newdbというデータベースがなかったため、MongoDBが自動的に作成しました。

インポートを確認しましょう。

新しく作成されたnewdbデータベースに接続します。

  1. sudo mongo newdb

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

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

  1. db.restaurants.count()

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

  1. db.restaurants.findOne()

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

Output
{ "_id" : ObjectId("5fac3d937f12c471b3f26733"), "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以外のユーザーとして、通常のコマンドラインプロンプトに戻ります。

ステップ2—MongoDBから情報をエクスポートする

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

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

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

  1. sudo mongoexport --db newdb -c restaurants --out newdbexport.json

上記のコマンドでは、--dbを使用してデータベースを指定し、-cをコレクションに使用し、--outを使用してデータを保存するファイルを指定します。

成功したmongoexportの出力は、次のようになります。

Output
2020-11-11T19:39:57.595+0000 connected to: mongodb://localhost/ 2020-11-11T19:39:58.619+0000 [###############.........] newdb.restaurants 16000/25359 (63.1%) 2020-11-11T19:39:58.871+0000 [########################] newdb.restaurants 25359/25359 (100.0%) 2020-11-11T19:39:58.871+0000 exported 25359 records

上記の出力は、25359個のドキュメントがインポートされたことを示しています。これは、インポートされたドキュメントと同じ数です。

場合によっては、コレクションの一部のみをエクスポートする必要があります。 レストランのjsonファイルの構造と内容を考慮して、ブロンクス区に位置し、中華料理を提供するという基準を満たすすべてのレストランをエクスポートしてみましょう。 MongoDBに接続しているときにこの情報を直接取得する場合は、データベースに再度接続します。

  1. sudo mongo newdb

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

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

結果は端末に表示されます。

  1. Output
    2020-12-03T01:35:25.366+0000 connected to: mongodb://localhost/
  2. 2020-12-03T01:35:25.410+0000 exported 323 records

MongoDBプロンプトを終了するには、exitと入力します。

  1. exit

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

  1. sudo mongoexport --db newdb -c restaurants -q "{\"borough\": \"Bronx\", \"cuisine\": \"Chinese\"}" --out Bronx_Chinese_retaurants.json

クエリでは、円記号(\)を使用して二重引用符をエスケープしていることに注意してください。 同様に、クエリ内の他の特殊文字をエスケープする必要があります。

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

Output
2020-11-11T19:49:21.727+0000 connected to: mongodb://localhost/ 2020-11-11T19:49:21.765+0000 exported 323 records

上記は323レコードがエクスポートされたことを示しており、指定したBronx_Chinese_retaurants.jsonファイルで見つけることができます。

catおよびlessを使用してデータをスキャンします。

  1. cat Bronx_Chinese_retaurants.json | less

SPACEを使用して、データをページングします。

  1. Output
    date":{"$date":"2015-01-14T00:00:00Z"},"grade":"Z","score":36}],"na{"_id":{"$oid":"5fc8402d141f5e54f9054f8d"},"address":{"building":"1236","coord":[-73.8893654,40.81376179999999],"street":"238 Spofford Ave","zipcode":"10474"},"borough":"Bronx","cuisine":"Chinese","grades":[{"date":{"$date":"2013-12-30T00:00:00Z"},"grade":"A","score":8},{"date":{"$date":"2013-01-08T00:00:00Z"},"grade":"A","score":10},{"date":{"$date":"2012-06-12T00:00:00Z"},"grade":"B","score":15}],
  2. . . .

qを押して終了します。 これで、MongoDBデータベースをインポートおよびエクスポートできます。

結論

この記事では、MongoDBデータベースとの間で情報をインポートおよびエクスポートするための基本事項を紹介しました。 Ubuntu 20.04 でMongoDBデータベースをバックアップ、復元、および移行する方法については、さらに読むことができます。

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