1 回の操作で挿入またはアップデート
Overview
このガイドでは、アップサートの実行方法を学習できます。
サンプル データ
このガイドの例では、plants
コレクション内のドキュメントのモデルとして次の Plant
構造体を使用しています。
type Plant struct { Species string PlantID int32 `bson:"plant_id"` Height float64 }
このガイドの例を実行するには、次のスニペットを使用してサンプルデータを db.plants
コレクションにロードします。
coll := client.Database("db").Collection("plants") docs := []interface{}{ Plant{Species: "Polyscias fruticosa", PlantID: 1, Height: 27.6}, Plant{Species: "Polyscias fruticosa", PlantID: 2, Height: 34.9}, Plant{Species: "Ledebouria socialis", PlantID: 1, Height: 11.4}, } result, err := coll.InsertMany(context.TODO(), docs)
各ドキュメントにはそれぞれの植物の説明が含まれており、各ドキュメントの species
、 plant_id
、 height
の各フィールドに対応する種、植物 ID、高さが記載されています。
Tip
存在しないデータベースとコレクション
書き込み操作を実行するときに必要なデータベースとコレクションが存在しない場合は、サーバーが暗黙的にそれらを作成します。
アップサート
アプリケーションにより、挿入操作と更新操作を使用してデータの保存および変更が行われます。ドキュメントが存在するかどうかに応じて、挿入操作と更新操作のどちらかを選択しなければならない場合があります。MongoDB ではアップサートのオプションによって簡単に対応できます。
アップサートでは、次のいずれかのアクションが実行されます。
クエリフィルターに一致するドキュメントを更新します
クエリフィルターに一致するものがない場合、新しいドキュメントを挿入します
次の書込み操作メソッドのオプションでtrue
をSetUpsert()
メソッドに渡すことで、アップサートを指定できます。
UpdateOne()
UpdateByID()
UpdateMany()
ReplaceOne()
FindOneAndUpdate()
FindOneAndReplace()
Tip
アップサートを指定しない場合、クエリフィルターに一致するドキュメントがない場合でも、書込み操作は変更されません。これはSetUpsert()
メソッドにfalse
を渡すことと同じです。
例
次の例では、次のアクションが実行されます。
species
が「Ledebouria socialis」で、plant_id
が3
のドキュメントに一致します一致したドキュメントの
height
を8.3
に更新しますクエリフィルターに一致するものがない場合、このドキュメントを挿入します
filter := bson.D{{"species", "Ledebouria socialis"}, {"plant_id", 3}} update := bson.D{{"$set", bson.D{{"species", "Ledebouria socialis"}, {"plant_id", 3}, {"height", 8.3}}}} opts := options.Update().SetUpsert(true) result, err := coll.UpdateOne(context.TODO(), filter, update, opts) if err != nil { panic(err) } fmt.Printf("Number of documents updated: %v\n", result.ModifiedCount) fmt.Printf("Number of documents upserted: %v\n", result.UpsertedCount)
plants
コレクションをクエリしてすべてのドキュメントを表示すると、クエリフィルターがどのドキュメントにも一致しなかったため、指定したフィールドに新しいドキュメントが挿入されたことがわかります。
{"species":"Polyscias fruticosa","plant_id":1,"height":27.6} {"species":"Polyscias fruticosa","plant_id":2,"height":34.9} {"species":"Ledebouria socialis","plant_id":1,"height":11.4} {"species":"Ledebouria socialis","plant_id":3,"height":8.3}
詳細情報
上記で説明されている操作の詳細については、次のガイドを参照してください。
API ドキュメント
このガイドで言及されているメソッドや型の詳細については、以下のAPIドキュメントを参照してください。