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

一括操作

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

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

書き込み (write) 時にドキュメント レベルの検証をオプトアウトできるようにするかどうか。
デフォルト: false

SetOrdered()

エラーの発生後に書き込み (write)操作の実行を停止するかどうか。
デフォルト: true

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

プロパティ
説明

InsertedCount

挿入されたドキュメントの数。

MatchedCount

アップデート操作と置換操作でクエリフィルターに一致したドキュメントの数。

ModifiedCount

更新操作と置換操作によって変更されたドキュメントの数。

DeletedCount

削除されたドキュメントの数。

UpsertedCount

更新操作と置換操作によってアップサートされたドキュメントの数。

UpsertedIDs

アップサートされたドキュメントの_idへの操作インデックスのマッピング。

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

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

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

方式
説明

SetDocument()

挿入するドキュメント。

次の例では、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()

結果をソートするときに使用する言語照合のタイプ。

SetFilter()

置き換えるドキュメントを指定するクエリフィルター

SetHint()

ドキュメントをスキャンするために使用するインデックス。

SetReplacement()

一致したドキュメントを置き換えるドキュメント。

SetUpsert()

クエリフィルターがどのドキュメントにも一致しない場合に新しいドキュメントを挿入するかどうか。

次の例では、 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()

アップデートが適用される配列要素。

SetCollation()

結果をソートするときに使用する言語照合のタイプ。

SetFilter()

アップデートするドキュメントを指定するクエリフィルター

SetHint()

ドキュメントをスキャンするために使用するインデックス。

SetUpdate()

一致したドキュメントに適用される変更内容。

SetUpsert()

クエリフィルターがどのドキュメントにも一致しない場合に新しいドキュメントを挿入するかどうか。

次の例では、 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()

結果をソートするときに使用する言語照合のタイプ。

SetFilter()

削除するドキュメントを指定するクエリフィルター

SetHint()

ドキュメントをスキャンするために使用するインデックス。

次の例では、 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)
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 ドキュメントを参照してください。