AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。

db.コレクション.insertMany()(mongoshメソッド)

MongoDB とドライバー

このページでは、mongosh メソッドのドキュメントについて記載しています。MongoDB ドライバーで同等のメソッドを確認するには、ご使用のプログラミング言語の対応するページを参照してください。
db.collection.insertMany()

コレクションに複数のドキュメントを挿入します。

次の値を返します。

次の要素を含むドキュメント:

  • acknowledged ブール値は、操作が書込み保証付きで実行された場合は true に設定され、書込み保証が無効になっている場合は false に設定されます。

  • 正常に挿入された各ドキュメントの _id 値を含む insertedIds 配列

このメソッドは、次の環境でホストされている配置で使用できます。

  • MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです

注意

このコマンドは、すべての MongoDB Atlas クラスターでサポートされています。すべてのコマンドに対する Atlas のサポートについては、「サポートされていないコマンド」を参照してください。

  • MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン

  • MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン

db.collection.insertMany() の構文は次のとおりです。

db.collection.insertMany( [ <document 1> , <document 2>, ... ], { writeConcern: <document>, ordered: <boolean> })
Parameter
タイプ
説明

document

ドキュメント

コレクションに挿入するドキュメントの配列。

writeConcern

ドキュメント

任意。書込み保証(write concern)を表現するドキュメント。デフォルトの書込み保証を使用する場合は省略します。

トランザクションで実行される場合、操作の書込み保証 (write concern)を明示的に設定しないでください。トランザクションで書込み保証を使用するには、「トランザクション書込み保証」を参照してください。

ordered

ブール値

任意。mongod インスタンスが順序付き挿入を実行するか、順序なし挿入を実行するかを指定するブール値。デフォルト値は true です。

ドキュメントの配列が与えられると、insertMany() は配列内の各ドキュメントをコレクションに挿入します。配列に指定できるドキュメントの数に制限はありません。

デフォルトでは、ドキュメントは提供された順序で挿入されます。

  • ordered がtrue に設定され、挿入に失敗した場合、サーバーはレコードの挿入を続行しません。

  • ordered が false に設定されている場合に挿入に失敗しても、サーバーはレコードの挿入を続行します。パフォーマンスを向上させるために、ドキュメントは mongod によって並べ替えられる場合があります。使用する insertMany() が順序付けられていない場合、アプリケーションは挿入順序に依存しません。

シャーディングされたコレクションで ordered 操作リストを実行すると、通常、 unordered リストの実行よりも時間がかかります。これは、ordered リストでは毎回の操作で前の操作の完了を待機する必要があるためです。

ドライバーは、maxWriteBatchSize に従って、insertMany() 配列で指定されたドキュメントをバッチします。これは 100,000 となり、変更できません。たとえば、insertMany() 操作に 250,000 件のドキュメントが含まれている場合、ドライバーは 3 つのバッチを作成します。これは、 100,000 件のドキュメントを持つバッチが 2 つ、および50,000 件のドキュメントを持つバッチが 1 つで構成されます。

注意

ドライバーは、ハイレベル API を使用する場合にのみバッチ処理を実行します。db.runCommand() を直接使用する場合(たとえばドライバーを書き込む場合)、maxWriteBatchSize の制限を超える書き込みバッチを実行しようとすると、MongoDB はエラーを返します。

1 つのバッチのエラーレポートが大きくなりすぎた場合、MongoDB は残りのすべてのエラーメッセージを切り捨てます。サイズが 1MB を超えるエラーメッセージが少なくとも 2 つある場合、これらのメッセージは切り捨てられます。

サイズとグループ化の仕組みは内部的パフォーマンスの細部に該当し、今後のバージョンで変更される可能性があります。

コレクションが存在しない場合、insertMany() によってコレクションが作成されます。

挿入するドキュメントに _id フィールドが指定されていない場合、mongod によって _id フィールドが追加され、ドキュメントに一意の ObjectId() が割り当てられます。ほとんどのドライバーでは ObjectId が作成され、 _id フィールドが挿入されますが、ドライバーやアプリケーションでこの処理が行われない場合は、 mongod で_id の作成と入力が行われます。

ドキュメントに _id フィールドが含まれる場合に重複キー エラーを回避するには、_id 値がコレクション内で一意になるようにする必要があります。

insertMany() db.collection.explain()は と互換性がありません。

挿入は BulkWriteError の例外をスローします。

書込み保証(write concern)エラーを除き、順序付き操作はエラーの発生後に停止します。一方、順序なし操作はキューにある残りの書込み操作の処理を続行します。

書込み保証(write concern)エラーは writeConcernErrors フィールドに表示され、その他すべてのエラーは writeErrors フィールドに表示されます。エラーが発生した場合、挿入された _id のリストではなく、正常に実行された書込み操作の数が表示されます。順序付き操作では、発生したエラーが 1 つのみ表示され、順序なし操作では 1 つの配列内のそれぞれのエラーが表示されます。

コレクションでスキーマ検証が使用されており、 validationActionがerrorに設定されている場合、 insertMany()を使用して無効なドキュメントを挿入すると、 writeErrorがスローされます。 documents配列内の無効なドキュメントに先行するドキュメントは、 コレクションに書き込まれます。 残りの有効なドキュメントが挿入されるかどうかは、 orderedフィールドの値によって決まります。

insertMany() は分散トランザクション内で使用できます。

重要

ほとんどの場合、分散トランザクションでは 1 つのドキュメントの書き込み (write) よりもパフォーマンス コストが高くなります。分散トランザクションの可用性は、効果的なスキーマ設計の代わりにはなりません。多くのシナリオにおいて、非正規化されたデータモデル(埋め込みドキュメントと配列)が引き続きデータやユースケースに最適です。つまり、多くのシナリオにおいて、データを適切にモデリングすることで、分散トランザクションの必要性を最小限に抑えることができます。

トランザクションの使用に関するその他の考慮事項(ランタイム制限や oplog サイズ制限など)については、「本番環境での考慮事項」も参照してください。

トランザクションがクロスシャード間書き込みトランザクション(write transaction)でない場合に、分散トランザクション内にコレクションとインデックスを作成できます。

トランザクションにないコレクションに挿入を指定すると、MongoDB は暗黙的にコレクションを作成します。

トランザクションで実行される場合、操作の書込み保証 (write concern)を明示的に設定しないでください。トランザクションで書込み保証を使用するには、「トランザクション書込み保証」を参照してください。

インデックス フィールドで大量の無作為データ(例: ハッシュされたインデックス)の挿入操作が実行される場合、挿入パフォーマンスが低下することがあります。無作為データを一括挿入すると、無作為のインデックスエントリが作成され、インデックスのサイズが増大します。無作為な挿入ごとに別のインデックスエントリへのアクセスが必要なサイズにインデックスが達した場合、挿入により WiredTiger キャッシュがエビクションおよび置き換えられる率が上昇します。こうした場合、インデックスは完全にキャッシュされなくなり、ディスク上で更新されるため、パフォーマンスが低下します。

インデックス フィールドでの無作為データの一括挿入動作を向上させるには、次のいずれかを実行します。

  • インデックスを削除し、無作為データを挿入した後に再度作成します。

  • インデックスのない空のコレクションにデータを挿入します。

一括挿入後にインデックスを作成すると、メモリ内のデータがソートされ、すべてのインデックスに対して順序付き挿入が実行されます。

insertMany()操作によって 1 つ以上のドキュメントが正常に挿入されると、その操作によって挿入された各ドキュメント用のエントリがoplog (操作ログ)に追加されます。操作が失敗した場合、その操作によってoplogにエントリが追加されることはありません。

以下の例では、products コレクションにドキュメントを挿入しています。

次の例では、insertMany() を使用して、_id フィールドを含まないドキュメントを挿入します。

try { db.products.insertMany( [ { item: "card", qty: 15 }, { item: "envelope", qty: 20 }, { item: "stamps" , qty: 30 } ] );} catch (e) { print (e);}

この操作を実行すると次のドキュメントが返されます。

{ "acknowledged" : true, "insertedIds" : [ ObjectId("562a94d381cb9f1cd6eb0e1a"), ObjectId("562a94d381cb9f1cd6eb0e1b"), ObjectId("562a94d381cb9f1cd6eb0e1c") ]}

ドキュメントに _id が含まれていなかったため、mongod は各ドキュメント向けに _id フィールドを作成して追加し、そのフィールドにユニークな ObjectId() 値を割り当てます。

ObjectId 値は、操作が実行されるマシンと時間に固有であるため、実際の値は例の値と異なる可能性があります。

以下の例では、insertMany() を使って、_id フィールドを含むドキュメントを挿入します。重複キー エラーを回避するには、_id の値はコレクション内で一意である必要があります。

try { db.products.insertMany( [ { _id: 10, item: "large box", qty: 20 }, { _id: 11, item: "small box", qty: 55 }, { _id: 12, item: "medium box", qty: 30 } ] );} catch (e) { print (e);}

この操作を実行すると次のドキュメントが返されます。

{ "acknowledged" : true, "insertedIds" : [ 10, 11, 12 ] }

_id など、ユニークインデックスの構成キーに重複値を挿入すると、例外がスローされます。この例外を受け、既存の _id 値を持つドキュメントの挿入を試みます。

try { db.products.insertMany( [ { _id: 13, item: "envelopes", qty: 60 }, { _id: 13, item: "stamps", qty: 110 }, { _id: 14, item: "packing tape", qty: 38 } ] );} catch (e) { print (e);}

_id: 13 はすでにあるため、次の例外がスローされます。

BulkWriteError({ "writeErrors" : [ { "index" : 0, "code" : 11000, "errmsg" : "E11000 duplicate key error collection: inventory.products index: _id_ dup key: { : 13.0 }", "op" : { "_id" : 13, "item" : "stamps", "qty" : 110 } } ], "writeConcernErrors" : [ ], "nInserted" : 1, "nUpserted" : 0, "nMatched" : 0, "nModified" : 0, "nRemoved" : 0, "upserted" : [ ]})

挿入されたドキュメントは 1 つであることに注意してください。_id: 13 の最初のドキュメントは正常に挿入されますが、2 番目の挿入は失敗します。そのため、キューに残っている他のドキュメントも挿入が阻止されます。

ordered がfalse に設定されている場合、残りのドキュメントで挿入操作が続行されます。

次の例では、_id フィールドと ordered: false を伴う複数のドキュメントを挿入しようとしています。ドキュメントの配列には、_id フィールドが重複している 2 つのドキュメントが含まれています。

try { db.products.insertMany( [ { _id: 10, item: "large box", qty: 20 }, { _id: 11, item: "small box", qty: 55 }, { _id: 11, item: "medium box", qty: 30 }, { _id: 12, item: "envelope", qty: 100}, { _id: 13, item: "stamps", qty: 125 }, { _id: 13, item: "tape", qty: 20}, { _id: 14, item: "bubble wrap", qty: 30} ], { ordered: false } );} catch (e) { print (e);}

この操作では、次の例外がスローされます。

BulkWriteError({ "writeErrors" : [ { "index" : 2, "code" : 11000, "errmsg" : "E11000 duplicate key error collection: inventory.products index: _id_ dup key: { : 11.0 }", "op" : { "_id" : 11, "item" : "medium box", "qty" : 30 } }, { "index" : 5, "code" : 11000, "errmsg" : "E11000 duplicate key error collection: inventory.products index: _id_ dup key: { : 13.0 }", "op" : { "_id" : 13, "item" : "tape", "qty" : 20 } } ], "writeConcernErrors" : [ ], "nInserted" : 5, "nUpserted" : 0, "nMatched" : 0, "nModified" : 0, "nRemoved" : 0, "upserted" : [ ]})

item: "medium box" と item: "tape" を伴うドキュメントの挿入は、_id 値が重複しているため、失敗しますが、nInserted は残りの 5 つのドキュメントが挿入されたことを示しています。

3つのノードから成るレプリカセットにおいて、次の操作は w の majority と wtimeout の 100 を指定します。

try { db.products.insertMany( [ { _id: 10, item: "large box", qty: 20 }, { _id: 11, item: "small box", qty: 55 }, { _id: 12, item: "medium box", qty: 30 } ], { w: "majority", wtimeout: 100 } );} catch (e) { print (e);}

プライマリと少なくとも 1 つのセカンダリが 100 ミリ秒以内に各書き込み操作を確認すると、次の値が返されます。

{ "acknowledged" : true, "insertedIds" : [ ObjectId("562a94d381cb9f1cd6eb0e1a"), ObjectId("562a94d381cb9f1cd6eb0e1b"), ObjectId("562a94d381cb9f1cd6eb0e1c") ]}

レプリカセット内ですべての必須ノードによる書き込み (write) 操作の確認に必要な合計時間が wtimeout を超過した場合、wtimeout 期間が経過すると次の writeConcernError が表示されます。

この操作では以下が返されます。

WriteConcernError({ "code" : 64, "errmsg" : "waiting for replication timed out", "errInfo" : { "wtimeout" : true, "writeConcern" : { "w" : "majority", "wtimeout" : 100, "provenance" : "getLastErrorDefaults" } }})
このページを評価