Overview
このガイドでは、一括操作の使用方法を学習できます。
一括操作は、多数の書込み操作を実行します。 一括操作では、操作ごとにデータベースへの呼び出しを行う代わりに、データベースへの 1 回の呼び出しで複数の操作を実行します。
サンプル データ
このガイドの例では、 booksコレクション内のドキュメントのモデルとして、次の Book構造体を使用します。
type Book struct { Title string Author string Length int32 }
このガイドの例を実行するには、次のスニペットを使用してサンプルデータをdb.booksコレクションにロードします。
coll := client.Database("db").Collection("books") docs := []interface{}{ Book{Title: "My Brilliant Friend", Author: "Elena Ferrante", Length: 331}, Book{Title: "Lucy", Author: "Jamaica Kincaid", Length: 103}, } result, err := coll.InsertMany(context.TODO(), docs)
各ドキュメントには書籍の説明が含まれており、各ドキュメントのtitle 、 author 、 lengthフィールドに対応するタイトル、著者、ページ長が含まれています。
Tip
存在しないデータベースとコレクション
書き込み操作を実行するときに必要なデータベースとコレクションが存在しない場合は、サーバーが暗黙的にそれらを作成します。
一括書き込み (write)
一括操作を実行するには、 WriteModelドキュメントの配列をBulkWrite()メソッドに渡します。
動作の変更
BulkWrite()メソッドはオプションで、その動作を変更するために使用できるオプションを表すBulkWriteOptionsタイプを取ります。 BulkWriteOptionsを指定しない場合、ドライバーは各オプションのデフォルト値を使用します。
BulkWriteOptions タイプでは、次の方法でオプションを設定できます。
方式 | 説明 |
|---|---|
| Whether to allow the write to opt-out of document level validation. Default: false |
| Whether to stop performing write operations after an error occurs. Default: true |
Return Values
BulkWrite()メソッドからは、成功した場合の一括操作に関する情報が含まれるBulkWriteResultタイプが返されます。 BulkWriteResult型には次のプロパティが含まれています。
操作
WriteModelは、挿入、置換、更新、または削除操作を表します。
Insert
挿入操作を実行するには、挿入するドキュメントを指定するInsertOneModelを作成します。 複数のドキュメントを挿入するには、挿入するドキュメントごとにInsertOneModelを作成します。
InsertOneModelでは、次の方法で動作を指定できます。
方式 | 説明 |
|---|---|
| The document to insert. |
例
次の例では、2 つのドキュメントを挿入するために 2 つのInsertOneModelインスタンスを作成します。
models := []mongo.WriteModel{ mongo.NewInsertOneModel().SetDocument(Book{Title: "Beloved", Author: "Toni Morrison", Length: 324}), mongo.NewInsertOneModel().SetDocument(Book{Title: "Outline", Author: "Rachel Cusk", Length: 258}), }
置換
置換操作を実行するには、置換するドキュメントと置換ドキュメントを指定するReplaceOneModelを作成します。 複数のドキュメントを置き換えるには、置き換えるドキュメントごとにReplaceOneModelを作成します。
ReplaceOneModelでは、次のメソッドで動作を指定できます。
方式 | 説明 |
|---|---|
| The type of language collation to use when sorting results. |
| The query filter specifying which document to replace. |
| The index to use to scan for documents. |
| The document to replace the matched document with. |
| Whether to insert a new document if the query filter doesn't match any documents. |
例
次の例では、 ReplaceOneModelを作成して、 titleが「Lucy」であるドキュメントを新しいドキュメントに置き換えます。
models := []mongo.WriteModel{ mongo.NewReplaceOneModel().SetFilter(bson.D{{"title", "Lucy"}}). SetReplacement(Book{Title: "On Beauty", Author: "Zadie Smith", Length: 473}), }
Update
更新操作を実行するには、更新するドキュメントを指定するUpdateOneModelと更新ドキュメントを作成します。 複数のドキュメントを更新するには、 UpdateManyModelを使用します。
UpdateOneModelとUpdateManyModelでは、次のメソッドで動作を指定できます。
方式 | 説明 |
|---|---|
| The array elements the update applies to. |
| The type of language collation to use when sorting results. |
| The query filter specifying which document to update. |
| The index to use to scan for documents. |
| The modifications to apply on the matched documents. |
| Whether to insert a new document if the query filter doesn't match any documents. |
例
次の例では、 authorが「Elena Federation」の場合に、ドキュメントのlengthを15ずつ減算するためのUpdateOneModelを作成します。
models := []mongo.WriteModel{ mongo.NewUpdateOneModel().SetFilter(bson.D{{"author", "Elena Ferrante"}}). SetUpdate(bson.D{{"$inc", bson.D{{"length", -15}}}}), }
削除
削除操作を実行するには、削除するドキュメントを指定してDeleteOneModelを作成します。 複数のドキュメントを削除するには、 DeleteManyModelを使用します。
DeleteOneModelとDeleteManyModelでは、次のメソッドで動作を指定できます。
方式 | 説明 |
|---|---|
| The type of language collation to use when sorting results. |
| The query filter specifying which document to delete. |
| The index to use to scan for documents. |
例
次の例では、 lengthが300より大きいドキュメントを削除するためにDeleteManyModelを作成しています。
models := []mongo.WriteModel{ mongo.NewDeleteManyModel().SetFilter(bson.D{{"length", bson.D{{"$gt", 300}}}}), }
実行順序
BulkWrite()メソッドでは、 BulkWriteOptionsで一括操作を順序付きで実行するか、順序なしで実行するかを指定できます。
ordered
デフォルトでは、 BulkWrite()メソッドは一括操作を追加した順序で実行され、エラーが発生した場合は停止します。
Tip
これは、 SetOrdered()メソッドでtrueを指定することと同じです。
opts := options.BulkWrite().SetOrdered(true)
順序なし
一括書き込み操作を任意の順序で実行し、エラーが発生した場合に続行するには、 SetOrdered()メソッドにfalseを指定します。 メソッドはその後エラーを報告します。
例
次の例では、次のアクションを任意の順序で実行します。
2 つのドキュメントを挿入します。
titleが「My Billian MongoDB」であるドキュメントを新しいドキュメントに置き換えます。現在の
length値が200より小さい場合、すべてのドキュメントのlengthを10ずつ増加させます。authorフィールド値に「Jm」が含まれるすべてのドキュメントを削除します。
models := []mongo.WriteModel{ mongo.NewInsertOneModel().SetDocument(Book{Title: "Middlemarch", Author: "George Eliot", Length: 904}), mongo.NewInsertOneModel().SetDocument(Book{Title: "Pale Fire", Author: "Vladimir Nabokov", Length: 246}), mongo.NewReplaceOneModel().SetFilter(bson.D{{"title", "My Brilliant Friend"}}). SetReplacement(Book{Title: "Atonement", Author: "Ian McEwan", Length: 351}), mongo.NewUpdateManyModel().SetFilter(bson.D{{"length", bson.D{{"$lt", 200}}}}). SetUpdate(bson.D{{"$inc", bson.D{{"length", 10}}}}), mongo.NewDeleteManyModel().SetFilter(bson.D{{"author", bson.D{{"$regex", "Jam"}}}}), } opts := options.BulkWrite().SetOrdered(false) results, err := coll.BulkWrite(context.TODO(), models, opts) if err != nil { panic(err) } fmt.Printf("Number of documents inserted: %d\n", results.InsertedCount) fmt.Printf("Number of documents replaced or updated: %d\n", results.ModifiedCount) fmt.Printf("Number of documents deleted: %d\n", results.DeletedCount)
Number of documents inserted: 2 Number of documents replaced or updated: 2 Number of documents deleted: 1
一括操作後に次のドキュメントがbooksコレクションに存在します。
{"title":"Atonement","author":"Ian McEwan","length":351} {"title":"Middlemarch","author":"George Eliot","length":904} {"title":"Pale Fire","author":"Vladimir Nabokov","length":246}
詳細情報
一括操作の実行可能な例については、 「 一括操作の実行 」を参照してください。
関連操作
上記の操作の実行方法の詳細については、次のガイドを参照してください。
API ドキュメント
このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。