Docs Menu
Docs Home
/ / /
Go Driver
/ / /

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)

各ドキュメントにはそれぞれの植物の説明が含まれており、各ドキュメントの speciesplant_idheight の各フィールドに対応する種、植物 ID、高さが記載されています。

Tip

存在しないデータベースとコレクション

書き込み操作を実行するときに必要なデータベースとコレクションが存在しない場合は、サーバーが暗黙的にそれらを作成します。

アプリケーションにより、挿入操作と更新操作を使用してデータの保存および変更が行われます。ドキュメントが存在するかどうかに応じて、挿入操作と更新操作のどちらかを選択しなければならない場合があります。MongoDB ではアップサートのオプションによって簡単に対応できます。

アップサートでは、次のいずれかのアクションが実行されます。

  • クエリフィルターに一致するドキュメントを更新します

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

次の書込み操作メソッドのオプションでtrueSetUpsert()メソッドに渡すことで、アップサートを指定できます。

  • UpdateOne()

  • UpdateByID()

  • UpdateMany()

  • ReplaceOne()

  • FindOneAndUpdate()

  • FindOneAndReplace()

Tip

アップサートを指定しない場合、クエリフィルターに一致するドキュメントがない場合でも、書込み操作は変更されません。これはSetUpsert()メソッドにfalseを渡すことと同じです。

次の例では、次のアクションが実行されます。

  • speciesが「Ledebouria socialis」で、plant_id3のドキュメントに一致します

  • 一致したドキュメントのheight8.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ドキュメントを参照してください。

戻る

ドキュメント内の配列の更新