Docs Menu
Docs Home
/ / /
Go
/ / /

一括操作

項目一覧

  • Overview
  • サンプル データ
  • 一括書き込み (write)
  • 動作の変更
  • Return Values
  • 操作
  • Insert
  • 置換
  • Update
  • 削除
  • 実行順序
  • ordered
  • 順序なし
  • 詳細情報
  • 関連操作
  • API ドキュメント

このガイドでは、一括操作の使用方法を学習できます。

一括操作は、多数の書込み操作を実行します。 一括操作では、操作ごとにデータベースへの呼び出しを行う代わりに、データベースへの 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)

各ドキュメントには書籍の説明が含まれており、各ドキュメントのtitleauthorlengthフィールドに対応するタイトル、著者、ページ長が含まれています。

Tip

存在しないデータベースとコレクション

書き込み操作を実行するときに必要なデータベースとコレクションが存在しない場合は、サーバーが暗黙的にそれらを作成します。

一括操作を実行するには、 WriteModelドキュメントの配列をBulkWrite()メソッドに渡します。

BulkWrite()メソッドはオプションで、その動作を変更するために使用できるオプションを表すBulkWriteOptionsタイプを取ります。 BulkWriteOptionsを指定しない場合、ドライバーは各オプションのデフォルト値を使用します。

BulkWriteOptions タイプでは、次の方法でオプションを設定できます。

方式
説明
SetBypassDocumentValidation()
Whether to allow the write to opt-out of document level validation.
Default: false
SetOrdered()
Whether to stop performing write operations after an error occurs.
Default: true

BulkWrite()メソッドからは、成功した場合の一括操作に関する情報が含まれるBulkWriteResultタイプが返されます。 BulkWriteResult型には次のプロパティが含まれています。

プロパティ
説明
InsertedCount
挿入されたドキュメントの数。
MatchedCount
更新操作と置換操作でクエリフィルターに一致したドキュメントの数。
ModifiedCount
更新操作と置換操作によって変更されたドキュメントの数。
DeletedCount
削除されたドキュメントの数。
UpsertedCount
更新操作と置換操作によってアップサートされたドキュメントの数。
UpsertedIDs
アップサートされたドキュメントの_idへの操作インデックスのマッピング。

WriteModelは、挿入、置換、更新、または削除操作を表します。

挿入操作を実行するには、挿入するドキュメントを指定するInsertOneModelを作成します。 複数のドキュメントを挿入するには、挿入するドキュメントごとにInsertOneModelを作成します。

InsertOneModelでは、次の方法で動作を指定できます。

方式
説明
SetDocument()
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では、次のメソッドで動作を指定できます。

方式
説明
SetCollation()
The type of language collation to use when sorting results.
SetFilter()
The query filter specifying which document to replace.
SetHint()
The index to use to scan for documents.
SetReplacement()
The document to replace the matched document with.
SetUpsert()
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}),
}

更新操作を実行するには、更新するドキュメントを指定するUpdateOneModel更新ドキュメントを作成します。 複数のドキュメントを更新するには、 UpdateManyModelを使用します。

UpdateOneModelUpdateManyModelでは、次のメソッドで動作を指定できます。

方式
説明
SetArrayFilters()
The array elements the update applies to.
SetCollation()
The type of language collation to use when sorting results.
SetFilter()
The query filter specifying which document to update.
SetHint()
The index to use to scan for documents.
SetUpdate()
The modifications to apply on the matched documents.
SetUpsert()
Whether to insert a new document if the query filter doesn't match any documents.

次の例では、 authorが「Elena Federation」の場合に、ドキュメントのlength15ずつ減算するためのUpdateOneModelを作成します。

models := []mongo.WriteModel{
mongo.NewUpdateOneModel().SetFilter(bson.D{{"author", "Elena Ferrante"}}).
SetUpdate(bson.D{{"$inc", bson.D{{"length", -15}}}}),
}

削除操作を実行するには、削除するドキュメントを指定してDeleteOneModelを作成します。 複数のドキュメントを削除するには、 DeleteManyModelを使用します。

DeleteOneModelDeleteManyModelでは、次のメソッドで動作を指定できます。

方式
説明
SetCollation()
The type of language collation to use when sorting results.
SetFilter()
The query filter specifying which document to delete.
SetHint()
The index to use to scan for documents.

次の例では、 length300より大きいドキュメントを削除するためにDeleteManyModelを作成しています。

models := []mongo.WriteModel{
mongo.NewDeleteManyModel().SetFilter(bson.D{{"length", bson.D{{"$gt", 300}}}}),
}

BulkWrite()メソッドでは、 BulkWriteOptionsで一括操作を順序付きで実行するか、順序なしで実行するかを指定できます。

デフォルトでは、 BulkWrite()メソッドは一括操作を追加した順序で実行され、エラーが発生した場合は停止します。

Tip

これは、 SetOrdered()メソッドでtrueを指定することと同じです。

opts := options.BulkWrite().SetOrdered(true)

一括書き込み操作を任意の順序で実行し、エラーが発生した場合に続行するには、 SetOrdered()メソッドにfalseを指定します。 メソッドはその後エラーを報告します。

次の例では、次のアクションを任意の順序で実行します。

  • 2 つのドキュメントを挿入します。

  • titleが「My Billian MongoDB」であるドキュメントを新しいドキュメントに置き換えます。

  • 現在のlength値が200より小さい場合、すべてのドキュメントのlength10ずつ増加させます。

  • 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)

一括操作後に次のドキュメントがbooksコレクションに存在します。

{"title":"Atonement","author":"Ian McEwan","length":351}
{"title":"Middlemarch","author":"George Eliot","length":904}
{"title":"Pale Fire","author":"Vladimir Nabokov","length":246}

一括操作の実行可能な例については、 「 一括操作の実行 」を参照してください。

上記の操作の実行方法の詳細については、次のガイドを参照してください。

このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。

戻る

1 回の操作で挿入またはアップデート