MongoDB에서 기존 문서 업데이트하기
MongoDB 셸에서 제공되는 update() 메서드는 기존 문서의 값을 수정할 때 사용됩니다. 이 메서드는 지정한 조건에 일치하는 문서를 찾아 전달된 데이터로 갱신합니다.
기본 문법
db.COLLECTION_NAME.update(SELECTION_CRITERIA, UPDATED_DATA)첫 번째 인수인 SELECTION_CRITERIA에는 갱신할 문서를 찾기 위한 조건을, 두 번째 인수에는 변경할 데이터를 전달합니다.
Java에서 updateOne() 메서드로 문서 업데이트하기
Java 애플리케이션에서는 com.mongodb.client.MongoCollection 인터페이스가 제공하는 updateOne() 메서드를 사용해 단일 문서를 업데이트할 수 있습니다. 이 메서드에는 다음 두 가지 인수를 전달해야 합니다.
- 필터(Filter): 어떤 문서를 수정할지 결정하는 조건입니다. 일반적으로
com.mongodb.client.model.Filters클래스의 정적 메서드(예:Filters.eq())를 사용해 작성합니다. - 갱신 내용(Update): 적용할 변경 사항입니다.
com.mongodb.client.model.Updates클래스의set(),inc()등을 활용하면 편리하게 작성할 수 있습니다.
참고로 조건에 일치하는 모든 문서를 한 번에 수정하려면 updateMany() 메서드를 사용하면 됩니다.
전체 예제 코드
다음 예제는 세 개의 문서를 컬렉션에 삽입한 뒤, 이름이 "Robert"인 문서의 도시(city) 값을 "Delhi"로 변경하고 그 결과를 출력하는 과정을 보여줍니다.
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;
import com.mongodb.client.model.Updates;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.bson.Document;
import com.mongodb.MongoClient;
public class UpdatingDocuments {
public static void main(String args[]) {
// Mongo 클라이언트 생성
MongoClient mongo = new MongoClient("localhost", 27017);
// 데이터베이스에 연결
MongoDatabase database = mongo.getDatabase("myDatabase");
// 컬렉션 객체 가져오기
MongoCollection<Document> collection = database.getCollection("myCollection");
// 삽입할 문서 준비
Document document1 = new Document("name", "Ram").append("age", 26).append("city", "Hyderabad");
Document document2 = new Document("name", "Robert").append("age", 27).append("city", "Vishakhapatnam");
Document document3 = new Document("name", "Rhim").append("age", 30).append("city", "Delhi");
// 생성한 문서들을 컬렉션에 삽입
List<Document> list = new ArrayList<Document>();
list.add(document1);
list.add(document2);
list.add(document3);
collection.insertMany(list);
// 이름이 Robert인 문서의 city 값을 Delhi로 업데이트
collection.updateOne(Filters.eq("name", "Robert"), Updates.set("city", "Delhi"));
System.out.println("문서가 성공적으로 업데이트되었습니다...");
// 업데이트된 결과 확인
FindIterable<Document> iterDoc = collection.find();
Iterator it = iterDoc.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}실행 결과
문서가 성공적으로 업데이트되었습니다...
Document{{_id=5e86dd21e9b25f3460b1abe0, name=Ram, age=26, city=Hyderabad}}
Document{{_id=5e86dd21e9b25f3460b1abe1, name=Robert, age=27, city=Delhi}}
Document{{_id=5e86dd21e9b25f3460b1abe2, name=Rhim, age=30, city=Delhi}}실행 결과를 보면 이름이 "Robert"인 문서의 city 값이 "Vishakhapatnam"에서 "Delhi"로 성공적으로 변경된 것을 확인할 수 있습니다.
추가로 알아두면 좋은 점
- 반환값 활용:
updateOne()은UpdateResult객체를 반환하므로,getModifiedCount()를 호출하면 실제로 수정된 문서 수를 확인할 수 있습니다. - 드라이버 버전 주의: MongoDB Java 드라이버 4.x 이상에서는
new MongoClient()생성자가 지원 중단(deprecated)되었으므로,MongoClients.create("mongodb://localhost:27017")방식을 사용하는 것이 좋습니다. - _id 필드 불변성: 문서의
_id값은 한 번 생성되면 변경할 수 없으며, 업데이트 시 이를 수정하려고 하면 오류가 발생합니다.