この章では、Golang MongoDBでドキュメントデータを更新する方法について紹介します。

MongoDB でサポートされている更新関数

  • Collection.UpdateOne - 1つのデータを更新
  • Collection.UpdateMany - バッチでデータを更新
  • Collection.ReplaceOne - データを置換

テストデータを準備する

coll コレクションにデータをバッチで挿入します

docs := []interface{}{
	bson.D{
		{"item", "canvas"},
		{"qty", 100},
		{"size", bson.D{
			{"h", 28},
			{"w", 35.5},
			{"uom", "cm"},
		}},
		{"status", "A"},
	},
	// 以下略
};

result, err := coll.InsertMany(context.Background(), docs)

ドキュメントの更新

result, err := coll.UpdateOne(
	context.Background(), // コンテキストパラメータを取得
	bson.D{ // item=paper のドキュメントを見つけるためのクエリ条件を設定
		{"item", "paper"},
	},
	bson.D{ // 更新式を設定
		{"$set", bson.D{ // $setオペレータを使用して更新されたフィールドの内容を設定
			{"size.uom", "cm"},  // size.uomの値をcmに変更
			{"status", "P"}, // statusの値をPに変更
		}},
		{"$currentDate", bson.D{  // $currentDateオペレータを使用してlastModifiedフィールドの値を現在の時間に更新
			{"lastModified", true},
		}},
	},
)

クエリ条件に基づいてドキュメントをマッチングし、このドキュメントのコンテンツを更新します。

ヒント: MongoDBに慣れていない場合は、MongoDBチュートリアルを読んでください。

一括ドキュメントの更新

UpdateMany関数は、UpdateOne関数とは異なり、マッチング条件に基づいて一括で一致するドキュメントを更新します。

result, err := coll.UpdateMany(
	context.Background(),
	bson.D{ // クエリ条件を設定、qty > 50
		{"qty", bson.D{
			{"$lt", 50},
		}},
	},
	bson.D{ // 更新内容を設定
		{"$set", bson.D{
			{"size.uom", "cm"},
			{"status", "P"},
		}},
		{"$currentDate", bson.D{
			{"lastModified", true},
		}},
	},
)

ドキュメントの置換

指定されたクエリ条件に基づいて特定のドキュメントをクエリし、ドキュメントの内容を指定した内容で置き換えます。

ヒント: ドキュメントの置換とは、特定のフィールド値の部分的な更新ではなく、全体の置換を指します。

result, err := coll.ReplaceOne(
	context.Background(),
	bson.D{ // クエリ条件を設定、item=paper
		{"item", "paper"},
	},
	bson.D{ // 新しいドキュメントの内容を設定
		{"item", "paper"},
		{"instock", bson.A{
			bson.D{
				{"warehouse", "A"},
				{"qty", 60},
			},
			bson.D{
				{"warehouse", "B"},
				{"qty", 40},
			},
		}},
	},
)

まず、クエリ条件に基づいてitem=paperのドキュメントを検索し、その後指定した新しいドキュメントの内容で置き換えます。