ドキュメントの変更
Overview
このガイドでは、アップデート操作と置換操作を使用して MongoDB 内のドキュメントを変更する方法を学習できます。
更新操作では、指定したフィールドが変更されますが、他のフィールドと値は変更されません。 置き換え操作により、ドキュメント内の _id
を除くすべての既存のフィールドが削除され、削除されたフィールドは指定した新しいフィールドと値に置き換えられます。
MongoDB では、ドキュメントを変更するためのすべての方法は同じパターンに従います。
注意
プレースホルダー
changeX
はプレースホルダーであり、実際のメソッドではありません。
このパターンでは次のことが期待されています。
変更する 1 つ以上のドキュメントに一致するクエリフィルターを指定します。
フィールドと値の変更を指定します。
メソッドの動作を変更する必要がある場合は、オプションを指定します。
ドライバーは、ドキュメントを変更するための次のメソッドを提供します。
UpdateByID()
UpdateOne()
UpdateMany()
ReplaceOne()
BulkWrite()
(このガイドでは説明されていません)FindOneAndUpdate()
(このガイドでは説明されていません)FindOneAndReplace()
(このガイドでは説明されていません)
に関するメモ _id
MongoDB コレクション内の各ドキュメントには、一意かつ不変の_id
フィールドがあります。 _id
フィールドを変更するには、アップデート操作と置換操作を使用できません。 このフィールドを変更しようとすると、アップデート メソッドと置換メソッドはWriteError
を返します。
Update
単一のドキュメントを更新するには、 UpdateOne()
メソッドまたはUpdateByID()
メソッドを使用します。
複数のドキュメントを更新するには、 UpdateMany()
メソッドを使用します。
パラメーター
各メソッドは、少なくとも 1 つの更新演算子を含む更新ドキュメントを受け取ります。 更新演算子は、実行する更新のタイプを指定します。 更新ドキュメントには、変更を説明するフィールドと値も含まれます。 更新ドキュメントは、次の形式を使用します。
bson.D{{"<update operator>", bson.D{{"<field>", <value>}, {"<field>", <value>}, ... }}, {"<update operator>", ... }, ... }
更新演算子と説明を網羅したのリストについては、MongoDB サーバーのマニュアルを参照してください。
注意
更新操作における集計パイプライン
MongoDB Server バージョン4.2以降を使用している場合は、更新操作で 集計ステージ のサブセットで構成された集計パイプラインを使用できます。 MongoDB が集計パイプラインでサポートする集計ステージの詳細については、 集計パイプラインを使用して更新を実行するに関するチュートリアル を参照してください。
Return Values
UpdateOne()
、 UpdateByID()
、 UpdateMany()
は、操作が成功した場合、更新操作に関する情報を含むUpdateResult
タイプを返します。 UpdateResult
型には次のプロパティが含まれています。
プロパティ | 説明 |
---|---|
MatchedCount | フィルターに一致するドキュメントの数 |
ModifiedCount | 操作によって変更されたドキュメントの数 |
UpsertedCount | 操作によってアップサートされたドキュメントの数 |
UpsertedID | アップサートされたドキュメントの _id 、またはアップサートされたドキュメントがない場合はnil |
UpdateOne()
に渡されたクエリフィルターに一致するドキュメントが複数ある場合、メソッドは最初に一致したドキュメントを選択してアップデートします。 クエリフィルターに一致するドキュメントがない場合、アップデート操作では変更は行われません。
クエリフィルターに一致するドキュメントがない場合に新しいドキュメントを挿入する方法については、 アップサート ガイドをご覧ください。
例
次のドキュメントでは、従業員について説明しています。
{ "_id" : 2158, "name" : "Mary Shelley", "department" : "Marketing", "role" : "Marketing Analyst", "bonus" : 2500, ... }
次の例では、 UpdateByID()
メソッドを使用して次のことを行います。
_id
の値が2158であるドキュメントを一致させます。name
フィールドを「Mary Bearing Shelly」に設定し、role
フィールドを「マーケティング ディレクトリ」に設定します。bonus
フィールドの値を2000ずつ増加させます。
filter := bson.D{{"_id", 2158}} update := bson.D{{"$set", bson.D{{"name", "Mary Wollstonecraft Shelley"}, {"role", "Marketing Director"}}}, {"$inc", bson.D{{"bonus", 2000}}}} result, err := collection.UpdateOne(context.TODO(), filter, update) fmt.Printf("Documents matched: %v\n", result.MatchedCount) fmt.Printf("Documents updated: %v\n", result.ModifiedCount)
Documents matched: 1 Documents updated: 1
以下は、前述の更新操作によって更新されたドキュメントを示しています。
{ "_id" : 2158, "name" : "Mary Wollstonecraft Shelley", "department" : "Marketing", "role" : "Marketing Director", "bonus" : 4500, ... }
置換
単一のドキュメントを置き換えるには、 ReplaceOne()
メソッドを使用します。
パラメーター
ReplaceOne()
は、既存のドキュメントの代わりに使用するドキュメントである置換ドキュメントを要求しています。 置換ドキュメントは以下の形式を使用します。
bson.D{{"<field>", "<value>"}, {"<field>", "<value>"}, ... }
Return Values
ReplaceOne()
は、置換操作が成功した場合、置換操作に関する情報を含むUpdateResult
型を返します。 UpdateResult
型には次のプロパティが含まれています。
プロパティ | 説明 |
---|---|
MatchedCount | フィルターに一致するドキュメントの数 |
ModifiedCount | 操作によって変更されたドキュメントの数 |
UpsertedCount | 操作によってアップサートされたドキュメントの数 |
UpsertedID | アップサートされたドキュメントの _id 、またはアップサートされたドキュメントがない場合はnil |
ReplaceOne()
に渡されたクエリフィルターに一致するドキュメントが複数ある場合、メソッドは最初に一致したドキュメントを選択して置き換えます。 クエリフィルターに一致するドキュメントがない場合、置換操作は失敗します。
例
次のドキュメントでは、テーブル アイテムを説明しています。
{ "_id" : 2056, "item" : "Mug", "brand" : "Simply Ceramics", "price" : 2.99, "material" : "Glass" }
次の例では、ReplaceOne()
メソッドを使用して、このドキュメントを、値がitem
"Cup" のquantity
フィールドと値が の107 フィールドを含むドキュメントに置き換えます。
filter := bson.D{{"_id", 2056}} replacement := bson.D{{"item", "Cup"}, {"quantity", 107}} result, err := collection.ReplaceOne(context.TODO(), filter, replacement) fmt.Printf("Documents matched: %v\n", result.MatchedCount) fmt.Printf("Documents replaced: %v\n", result.ModifiedCount)
Documents matched: 1 Documents replaced: 1
置換されたドキュメントには、次のように、置換ドキュメントの内容と不変の_id
フィールドが含まれます。
{ "_id" : 2056, "item" : "Cup", "quantity" : 107 }
詳細情報
更新操作と置換操作の実行可能な例については、次の使用例を参照してください。
上記で説明されている操作の詳細については、次のガイドを参照してください。
配列要素の更新について詳しくは、「 ドキュメント内の配列を更新する 」を参照してください。
API ドキュメント
このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。