이 챕터에서는 Golang MongoDB에서 문서 데이터를 업데이트하는 방법을 소개합니다.

MongoDB에서 지원하는 업데이트 함수

  • Collection.UpdateOne - 단일 데이터 업데이트
  • 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 함수와의 차이점은 일치하는 기준에 따라 대량으로 일치하는 문서를 업데이트하는 것입니다.

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인 문서를 찾은 후 새로운 문서 내용으로 교체합니다.