mongoimport
を使用する場合 ファイルをMongoDBにインポートするには、使用するモードを指定するオプションがあります。これらのモードは、インポートしようとしているコレクションに一致するドキュメントがすでに存在する場合に何が起こるかを決定します。
デフォルトでは、mongoimport
insert
を使用します モードですが、使用できる他のモードがあります。使用するモードは、何をしようとしているかによって異なります。
以下は、各モードの概要と例です。
モード
mongoimport
で使用可能なインポートモード 次のとおりです:
モード | 説明 |
---|---|
insert | これはデフォルトのモードです。このモードでは、インポートファイルからドキュメントが挿入されます。一致するドキュメントがコレクションにすでに存在する場合、エラーが発生します。一致するドキュメントとは、同じ一意のID(一致する_id など)を持つドキュメントです。 フィールド)インポートファイルのドキュメントとして。 |
upsert | データベース内の既存のドキュメントを、インポートファイルの一致するドキュメントに置き換えます。他のすべてのドキュメントが挿入されます。 |
merge | インポートファイル内のドキュメントと一致する既存のドキュメントを新しいドキュメントとマージします。他のすべてのドキュメントが挿入されます。 |
delete | インポートファイル内のドキュメントと一致するデータベース内の既存のドキュメントを削除します。一致しないドキュメントは効果がありません。 |
各モードの仕組みの例を以下に示します。
挿入モード
pets
というコレクションがあるとします。 次のドキュメントを使用:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
結局のところ、これらはpets.json
というファイルにインポートされました。 。
ここで、pets2.json
という別のJSONファイルがあると想像してください。 、次のJSONドキュメントが含まれています:
{ "_id" : 1, "weight": 40 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight": 10 } { "_id" : 3, "name" : "Scratch", "type" : "Cat", "weight": 5 } { "_id" : 4, "name" : "Bubbles", "type" : "Fish", "weight": 3 }
これをpets
にインポートしようとするとどうなりますか 使用中のコレクション(デフォルト)insert
モード。
mongoimport --db=PetHotel --collection=pets --file=pets2.json
出力:
2021-01-03T10:07:23.421+1000 connected to: mongodb://localhost/ 2021-01-03T10:07:23.422+1000 continuing through error: E11000 duplicate key error collection: PetHotel.pets index: _id_ dup key: { _id: 1 } 2021-01-03T10:07:23.422+1000 continuing through error: E11000 duplicate key error collection: PetHotel.pets index: _id_ dup key: { _id: 2 } 2021-01-03T10:07:23.422+1000 continuing through error: E11000 duplicate key error collection: PetHotel.pets index: _id_ dup key: { _id: 3 } 2021-01-03T10:07:23.423+1000 1 document(s) imported successfully. 3 document(s) failed to import.
そのエラーメッセージによると、4つのドキュメントのうち1つだけがインポートされました。他の3つは、_id
に重複するキーがあるためにエラーが発生しました フィールド。
それでは、コレクションを見てみましょう。
db.pets.find()
結果:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" } { "_id" : 4, "name" : "Bubbles", "type" : "Fish", "weight" : 3 }
これで、最後のドキュメントが挿入されたことがわかります。以前は_id
のドキュメントがなかったため、これは予想されることです。 4
の値 。
アップサートモード
upsert
を使用するとどうなりますか 同じドキュメントを挿入するモード。
mongoimport --db=PetHotel --collection=pets --mode=upsert --file=pets2.json
出力:
2021-01-03T10:19:55.400+1000 connected to: mongodb://localhost/ 2021-01-03T10:19:55.444+1000 3 document(s) imported successfully. 0 document(s) failed to import.
出力から、4つのドキュメントのうち3つが正常にインポートされ、失敗はなかったことがわかります。
コレクションを確認しましょう。
db.pets.find()
結果:
{ "_id" : 1, "weight": 40 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight": 10 } { "_id" : 3, "name" : "Scratch", "type" : "Cat", "weight": 5 } { "_id" : 4, "name" : "Bubbles", "type" : "Fish", "weight": 3 }
最初の3つのドキュメントがインポートファイルのドキュメントに置き換えられていることがわかります。 4番目のドキュメントは、前回のインポート後と同じままです。
最初のドキュメントのname
が失われていることに注意してください およびtype
田畑。これは、upsert
が原因です モードはドキュメント全体を置き換え、置き換えられるドキュメントにはweight
のみが含まれます フィールド(および_id
分野)。
マージモード
pets2.json
を変更してみましょう 次のようにファイルします:
{ "_id" : 1, "name": "Wag", "type": "Dog" } { "_id" : 2, "name" : "Fetch" } { "_id" : 3, "name" : "Scratch" } { "_id" : 4, "name" : "Bubbles" } { "_id" : 5, "name" : "Hop", "type": "Kangaroo" }
それでは、mongoimport
を実行してみましょう。 もう一度コマンドを実行しますが、今回はmerge
モード:
mongoimport --db=PetHotel --collection=pets --mode=merge --file=pets2.json
出力:
2021-01-03T10:32:33.596+1000 connected to: mongodb://localhost/ 2021-01-03T10:32:33.607+1000 3 document(s) imported successfully. 0 document(s) failed to import.
出力によると、3つのドキュメントがインポートされました。
コレクションを見てみましょう。
db.pets.find()
結果:
{ "_id" : 1, "weight" : 40, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Fetch", "type" : "Dog", "weight" : 10 } { "_id" : 3, "name" : "Scratch", "type" : "Cat", "weight" : 5 } { "_id" : 4, "name" : "Bubbles", "type" : "Fish", "weight" : 3 } { "_id" : 5, "name" : "Hop", "type" : "Kangaroo" }
ドキュメント1と2が更新され、ドキュメント5が挿入されたことがわかります。ドキュメント1に関して、weight
インポートドキュメントにそのフィールドが含まれていなくても、フィールドは残りました。これは、merge
を使用したためです モード。 upsert
を使用した場合 モード(前の例のように)、weight
フィールドが消えていたでしょう。
削除モード
delete
を使用する場合 モードでは、一致するドキュメントはすべて削除されます。一致しないドキュメントはコレクションに残ります。
同じドキュメントをインポートするとどうなるか見てみましょう。ただし、今回はdelete
に切り替えます。 モード。
mongoimport --db=PetHotel --collection=pets --mode=delete --file=pets2.json
結果:
2021-01-03T10:39:38.925+1000 connected to: mongodb://localhost/ 2021-01-03T10:39:38.926+1000 5 document(s) deleted successfully. 0 document(s) failed to delete.
コレクション内の5つのドキュメントすべてが削除されました。
アップサートフィールドの変更/秒
--upsertFields
を使用できます _id
以外のフィールドを指定するパラメータ 対戦する。このパラメーターを使用する場合は、フィールドをコンマ区切りのリストとして渡します。
mongoimport
があるかどうかわからない ?
mongoimport
MongoDBデータベースツールパッケージの一部です。 MongoDBデータベースツールは、MongoDBを操作するためのコマンドラインユーティリティのスイートです。
MongoDBデータベースツール/mongoimport
を使用しているかどうかわからない場合 インストールされている場合は、ターミナルまたはコマンドプロンプトで次のコマンドを実行して確認してください。
mongoimport --version
持っている場合は、バージョン情報などが表示されます。持っていない場合は、MongoDB Webサイトにあるインストール手順を使用して、システムにインストールできます。
mongoimport
を実行する場所 コマンド?
mongoimport
を実行する必要があります システムのコマンドラインからのコマンド(新しいターミナルやコマンドプロンプトウィンドウなど)。
mongo
から実行しないでください シェル。