複合演算子
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 := []interface{}{ 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()
メソッド。
動作の変更
FineOneAndDeleteOptions
を渡すことで、 FindOneAndDelete()
メソッドの動作を変更できます。 FineOneAndDeleteOptions
を指定しない場合、ドライバーは各オプションのデフォルト値を使用します。
FineOneAndDeleteOptions
タイプでは、次の方法でオプションを設定できます。
方式 | 説明 |
---|---|
SetCollation() | The type of language collation to use when sorting results. Default: nil |
SetMaxTime() | The maximum amount of time that the query can run on the server. Default: nil |
SetProjection() | The fields to include in the document returned. Default: nil |
SetSort() | The sort fields and directions to order the documents matched. Default: nil |
SetHint() | 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()
メソッドもアトミック操作ですが、一致したドキュメントの並べ替え順序を指定できないという点がFindOneAndUpdate()
とは異なります。
ドキュメントを検索して個別の操作で更新するには、 findOne()
メソッドを呼び出し、その後にupdateOne()
メソッドを呼び出します。
動作の変更
FineOneAndUpdateOptions
を渡すことで、 FindOneAndUpdate()
メソッドの動作を変更できます。 FineOneAndUpdateOptions
を指定しない場合、ドライバーは各オプションのデフォルト値を使用します。
FineOneAndUpdateOptions
タイプでは、次の方法でオプションを設定できます。
方式 | 説明 |
---|---|
SetArrayFilters() | The array elements the update applies to. Default: nil |
SetBypassDocumentValidation() | Whether to allow the write operation to opt-out of document level validation. Default: false |
SetCollation() | The type of language collation to use when sorting results. Default: nil |
SetMaxTime() | The maximum amount of time that the query can run on the server. Default: nil |
SetProjection() | The fields to include in the document returned. Default: nil |
SetReturnDocument() | Whether to return the original or updated document in the SingleResult .Default: options.Before |
SetSort() | The sort fields and directions to order the documents matched. Default: nil |
SetUpsert() | Whether to insert a new document if the query filter doesn't match any documents. Default: false |
SetHint() | 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()
は検索と置換を単一の操作として実行し、両方の操作の間にドキュメントが変更される可能性を排除します。
動作の変更
FineOneAndReplaceOptions
を渡すことで、 FindOneAndReplace()
メソッドの動作を変更できます。 FineOneAndReplaceOptions
を指定しない場合、ドライバーは各オプションのデフォルト値を使用します。
FineOneAndReplaceOptions
タイプでは、次の方法でオプションを設定できます。
方式 | 説明 |
---|---|
SetBypassDocumentValidation() | Whether to allow the write operation to opt-out of document level validation. Default: false |
SetCollation() | The type of language collation to use when sorting results. Default: nil |
SetMaxTime() | The maximum amount of time that the query can run on the server. Default: nil |
SetProjection() | The fields to include in the document returned. Default: nil |
SetReturnDocument() | Whether to return the original or replaced document in the SingleResult .Default: nil |
SetSort() | The sort fields and directions to order the documents matched. Default: nil |
SetUpsert() | Whether to insert a new document if the query filter doesn't match any documents. Default: false |
SetHint() | 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 ドキュメントを参照してください。