ドキュメントの挿入
Overview
このガイドでは、MongoDB .NET/C# ドライバーを使用して挿入操作を実行し、MongoDB コレクションにドキュメントを追加する方法を学習できます。
挿入操作は、1 つ以上のドキュメントを MongoDB コレクションに挿入します。 .NET/C# ドライバーは、挿入操作を実行するための次のメソッドを提供します。それぞれに非同期バージョンと同期バージョンがあります。
InsertOneAsync()
orInsertOne()
InsertManyAsync()
orInsertMany()
Tip
インタラクティブ ラボ
このページには、 InsertOneAsync()
メソッドを使用してデータを挿入する方法を示す短いインタラクティブ ラボが含まれています。 MongoDB やコード エディターをインストールしなくても、ブラウザ ウィンドウでこのラボを直接完了できます。
ラボを開始するには、ページ上部の [ Open Interactive Tutorialボタンをクリックします。 ラボを全画面形式に展開するには、ラボ ペインの右上隅にある全画面ボタン( ⛶ )をクリックします。
サンプル データ
このガイドの例では、 sample_restaurants
データベースのrestaurants
コレクションを使用します。 このコレクションのドキュメントでは、次のRestaurant
、 Address
、 GradeEntry
クラスをモデルとして使用します。
public class Restaurant { public ObjectId Id { get; set; } public string Name { get; set; } [ ] public string RestaurantId { get; set; } public string Cuisine { get; set; } public Address Address { get; set; } public string Borough { get; set; } public List<GradeEntry> Grades { get; set; } }
public class Address { public string Building { get; set; } [ ] public double[] Coordinates { get; set; } public string Street { get; set; } [ ] public string ZipCode { get; set; } }
public class GradeEntry { public DateTime Date { get; set; } public string Grade { get; set; } public float? Score { get; set; } }
注意
restaurants
コレクションのドキュメントは、スニペット ケースの命名規則を使用します。このガイドの例では、ConventionPack
を使用してコレクション内のフィールドをパスカル ケースに逆シリアル化し、Restaurant
クラスのプロパティにマップします。
カスタム直列化について詳しくは、「 カスタム直列化 」を参照してください。
このコレクションは、Atlas が提供するサンプル データセットからのものです。 MongoDB クラスターを無料で作成して、このサンプル データをロードする方法については、クイック スタートを参照してください。
_id
フィールド
MongoDB コレクションでは、各ドキュメントに一意のフィールド値を持つ_id
フィールドが含まれている必要があります。
MongoDB では、このフィールドは次の 2 つの方法で管理できます。
このフィールドは各ドキュメントに自分で設定することができ、各
_id
フィールド値が一意であることを確認します。ドライバーを使用して、各ドキュメント
_id
に対して一意のObjectId
値を自動的に生成できます。 ドキュメントの_id
フィールド値を手動で設定しない場合、ドライバーはフィールドにObjectId
を入力します。
一意性を保証できない限り、MongoDB ではドライバーに_id
値を自動的に生成させることをお勧めします。
注意
重複した_id
値は一意のインデックス制約に違反するため、ドライバーはInsertOne()
MongoWriteException
を、またはInsertMany()
MongoBulkWriteException
を返します。
_id
フィールドの詳細については、一意なインデックス に関するサーバー マニュアル エントリを参照してください。
ドキュメント構造とルールの詳細については、ドキュメント に関するサーバー マニュアル エントリを参照してください。
1つのドキュメントの挿入
次のコードは、非同期InsertOneAsync()
メソッドまたは同期InsertOne()
メソッドを使用して 1 つのドキュメントを挿入する方法を示しています。
await _restaurantsCollection.InsertOneAsync(document);
_restaurantsCollection.InsertOne(document);
複数のドキュメントの挿入
次のコードは、非同期InsertManyAsync()
メソッドまたは同期InsertMany()
メソッドを使用して複数のドキュメントを挿入する方法を示しています。
await _restaurantsCollection.InsertManyAsync(docs);
_restaurantsCollection.InsertMany(docs);
Tip
これらのメソッドを使用して実行可能な例については、追加情報を参照してください。
挿入動作の変更
InsertOne()
メソッドは、挿入するドキュメントをパラメータとして受け取ります。 InsertMany()
メソッドは、リストや配列などのドキュメントのIEnumerable
コレクションをパラメータとして受け取ります。
オプションで、 InsertOne()
メソッドは追加のパラメーターとしてInsertOneOptions
型を受け取ります。これは、挿入操作を構成するために使用できるオプションを表します。 InsertOneOptions
プロパティを指定しない場合、ドライバーは挿入をカスタマイズしません。
InsertOneOptions
タイプでは、次のプロパティを持つオプションを構成できます。
プロパティ | 説明 |
---|---|
BypassDocumentValidation | Gets or sets a value indicating whether to bypass document
validation. If true , allows the write to opt-out of
document level validation. |
Comment | Gets or sets the comment for the operation. See the insert command
fields
for more information. |
InsertMany()
メソッドはオプションとして、前述のBypassDocumentValidation
とComment
プロパティと追加のIsOrdered
プロパティを持つInsertManyOptions
型を追加のパラメータとして取ることができます。
プロパティ | 説明 |
---|---|
IsOrdered | Gets or sets a value indicating whether the requests are
fulfilled in order. If true , the driver sends documents to the
server in the order provided. If an error occurs, the driver
and server abort all remaining insert operations.
To learn more, see Ordered Behavior.Default: true |
例
次のコードでは、 InsertMany()
メソッドを使用して、 BypassDocumentValidation
がtrue
に設定されているコレクションに 5 つの新しいRestaurant
ドキュメントを挿入します。
// Generates 5 new restaurants by using a helper method var restaurants = GenerateDocuments(); // Creates an option object to bypass documentation validation on the documents var options = new InsertManyOptions() { BypassDocumentValidation = true }; // Inserts the new documents into the restaurants collection with the specified options _restaurantsCollection.InsertMany(restaurants, options);
InsertMany()
メソッドには戻り値がありません。 コレクションに対してFind()
操作を実行すると、ドキュメントが正常に挿入されたことを確認できます。 ドキュメントの検索方法の例については、「 ドキュメントを検索する 」を参照してください。
順序付き動作の指定
たとえば、次のドキュメントを挿入するとします。
{ "_id" : 1, "name" : "Restaurant A" } { "_id" : 2, "name" : "Restaurant B" } { "_id" : 1, "name" : "Restaurant C" } { "_id" : 3, "name" : "Restaurant D" }
これらのドキュメントをデフォルトのInsertManyOptions
で挿入しようとすると、 _id
値が繰り返されているために 3 番目のドキュメントでドライバーはMongoBulkWriteException
をスローしますが、エラーが発生したドキュメントの前のドキュメントはコレクションに挿入されます。
コレクション内を確認すると、次のドキュメントが表示されます。
{ "_id" : 1, "name" : "Restaurant A" } { "_id" : 2, "name" : "Restaurant B" }
挿入操作でIsOrdered
をfalse
に設定すると、一部のドキュメントでエラーが発生しても、ドライバーはドキュメントの挿入を続行します。 この変更された挿入動作では、ドライバーは例外をスローしますが、エラーを生成しないすべてのドキュメントが挿入されます。
コレクション内を確認すると、次のドキュメントが表示されます。
{ "_id" : 1, "name" : "Restaurant A" } { "_id" : 2, "name" : "Restaurant B" } { "_id" : 3, "name" : "Restaurant D" }
詳細情報
挿入操作の実行可能な例については、次の使用例を参照してください。
API ドキュメント
このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。