Overview
このガイドでは、複合操作の実行方法を学習できます。
複合操作は、読み取り操作と書込み (write) 操作を 1 つの操作に結合します。 読み取り操作と書込み操作を個別に実行すると、両方の操作の間に他のユーザーがドキュメントを変更する可能性があります。 MongoDB は、複合操作の実行中に変更されたドキュメントに書込みロック (write lock) を適用することで、これを防ぎます。
MongoDB は次の複合操作をサポートしています。
Tip
複数のドキュメントに対して複合操作を一度に実行する方法については、 トランザクションガイドをご覧ください。
サンプル データ
このガイドの例では、 coursesコレクション内のドキュメントのモデルとして、次の Course構造体を使用します。
type Course struct { Title string Enrollment int32 }
このガイドの例を実行するには、次のスニペットを使用してサンプルデータをdb.coursesコレクションにロードします。
coll := client.Database("db").Collection("courses") docs := []any{ Course{Title: "Representation Theory", Enrollment: 40}, Course{Title: "Early Modern Philosophy", Enrollment: 25}, Course{Title: "Animal Communication", Enrollment: 18}, } result, err := coll.InsertMany(context.TODO(), docs)
各ドキュメントには、各ドキュメントの フィールドとtitle enrollmentフィールドに対応する、コース名と最大登録者数を含む大学コースの説明が含まれています。
Tip
存在しないデータベースとコレクション
書き込み操作を実行するときに必要なデータベースとコレクションが存在しない場合は、サーバーが暗黙的にそれらを作成します。
検索と削除
FindOneAndDelete()メソッドは、指定されたクエリフィルターに一致する最初のドキュメントを検索し、そのドキュメントを削除します。 このメソッドは、削除されたドキュメントを含むSingleResultを返します。
注意
FindOneAndDelete()メソッドはアトミック操作であるため、完了するまで、他の書込み操作によって一致するドキュメントが変更されるのを防ぎます。 DeleteOne()メソッドもアトミック操作ですが、一致したドキュメントの並べ替え順序を指定できないという点がFindOneAndDelete()とは異なります。
ドキュメントを検索して個別の操作で削除するには、FindOne() メソッドを呼び出し、その後に DeleteOne() メソッドを呼び出します。
動作の変更
FindOneAndDeleteOptionsを渡すことで、 FindOneAndDelete()メソッドの動作を変更できます。 FindOneAndDeleteOptionsを指定しない場合、ドライバーは各オプションのデフォルト値を使用します。
FindOneAndDeleteOptions タイプでは、次の方法でオプションを設定できます。
方式 | 説明 |
|---|---|
| The type of language collation to use when sorting results. Default: nil |
| The fields to include in the document returned. Default: nil |
| The sort fields and directions to order the documents matched. Default: nil |
| The index to use to scan for documents. Default: nil |
例
次の例では、 FindOneAndDelete()メソッドを使用して、 enrollmentフィールドの値が20より小さい最初のドキュメントを検索して削除します。
filter := bson.D{{"enrollment", bson.D{{"$lt", 20}}}} var deletedDoc Course err := coll.FindOneAndDelete(context.TODO(), filter).Decode(&deletedDoc) if err != nil { panic(err) } res, _ := bson.MarshalExtJSON(deletedDoc, false, false) fmt.Println(string(res))
{"title":"Animal Communication","enrollment":18}
検索と更新
FindOneAndUpdate()メソッドは、指定されたクエリフィルターに一致する最初のドキュメントを検索し、更新ドキュメントに従って更新します。 このメソッドは一致したドキュメントを含むSingleResultを返します。
注意
FindOneAndUpdate() メソッドはアトミック操作であるため、完了するまで、他の書込み操作によって一致するドキュメントが変更されるのを防ぎます。UpdateOne() メソッドもアトミック操作ですが、UpdateOne() を使用する場合は更新されたドキュメントの変更前のイメージを返すことができないため、FindOneAndUpdate() とは異なります。
ドキュメントを検索して個別の操作で更新するには、 FindOne()メソッドを呼び出し、その後にUpdateOne()メソッドを呼び出します。
動作の変更
FindOneAndUpdateOptionsを渡すことで、 FindOneAndUpdate()メソッドの動作を変更できます。 FindOneAndUpdateOptionsを指定しない場合、ドライバーは各オプションのデフォルト値を使用します。
FindOneAndUpdateOptions タイプでは、次の方法でオプションを設定できます。
方式 | 説明 |
|---|---|
| The array elements the update applies to. Default: nil |
| Whether to allow the write operation to opt-out of document level validation. Default: false |
| The type of language collation to use when sorting results. Default: nil |
| The fields to include in the document returned. Default: nil |
| Whether to return the original or updated document in the SingleResult.Default: options.Before |
| The sort fields and directions to order the documents matched. Default: nil |
| Whether to insert a new document if the query filter doesn't match any documents. Default: false |
| The index to use to scan for documents. Default: nil |
例
次の例では、 FindOneAndUpdate()メソッドを使用して、次のアクションを順番に実行します。
titleフィールド値に「Modern」が含まれる最初のドキュメントと一致します一致したドキュメントの
enrollmentフィールド値を32に更新します更新されたドキュメントを返します
filter := bson.D{{"title", bson.D{{"$regex", "Modern"}}}} update := bson.D{{"$set", bson.D{{"enrollment", 32}}}} opts := options.FindOneAndUpdate().SetReturnDocument(options.After) var updatedDoc Course err := coll.FindOneAndUpdate(context.TODO(), filter, update, opts).Decode(&updatedDoc) if err != nil { panic(err) } res, _ := bson.MarshalExtJSON(updatedDoc, false, false) fmt.Println(string(res))
{"title":"Early Modern Philosophy","enrollment":32}
検索と置換
FindOneAndReplace()メソッドは、指定されたクエリフィルターに一致する最初のドキュメントを検索し、それを置換ドキュメントに置き換えます。 このメソッドは一致したドキュメントを含むSingleResultを返します。
注意
このメソッドはReplaceOne()メソッドとは異なります。 FindOneAndReplace()は検索と置換を単一の操作として実行し、両方の操作の間にドキュメントが変更される可能性を排除します。
動作の変更
FindOneAndReplaceOptionsを渡すことで、 FindOneAndReplace()メソッドの動作を変更できます。 FindOneAndReplaceOptionsを指定しない場合、ドライバーは各オプションのデフォルト値を使用します。
FindOneAndReplaceOptions タイプでは、次の方法でオプションを設定できます。
方式 | 説明 |
|---|---|
| Whether to allow the write operation to opt-out of document level validation. Default: false |
| The type of language collation to use when sorting results. Default: nil |
| The fields to include in the document returned. Default: nil |
| Whether to return the original or replaced document in the SingleResult.Default: nil |
| The sort fields and directions to order the documents matched. Default: nil |
| Whether to insert a new document if the query filter doesn't match any documents. Default: false |
| The index to use to scan for documents. Default: nil |
例
次の例では、 FindOneAndReplace()メソッドを使用して、次のアクションを順番に実行します。
titleが「表現論理」である最初のドキュメントに一致します一致したドキュメントを、
titleが「組み合わせ論理」で、enrollmentが35の新しいドキュメントを置き換えます
filter := bson.D{{"title", "Representation Theory"}} replacement := Course{Title: "Combinatorial Theory", Enrollment: 35} var outdatedDoc Course err := coll.FindOneAndReplace(context.TODO(), filter, replacement).Decode(&previousDoc) if err != nil { panic(err) } res, _ := bson.MarshalExtJSON(outdatedDoc, false, false) fmt.Println(string(res))
{"title":"Representation Theory","enrollment":40}
詳細情報
上記の操作の実行方法の詳細については、次のガイドを参照してください。
API ドキュメント
このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。