Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java로 MongoDB 컬렉션에서 여러 문서 한 번에 삭제하기 — deleteMany() 메서드 완벽 가이드

Java에서 com.mongodb.client.MongoCollection 인터페이스는 deleteMany() 메서드를 제공합니다. 이 메서드를 사용하면 조건에 일치하는 여러 문서를 한 번의 호출로 삭제할 수 있습니다. 호출 시에는 삭제 기준을 정의하는 필터(filter)를 인자로 전달해야 하며, 필터와 일치하는 모든 문서가 컬렉션에서 제거됩니다.

참고로 단일 문서만 삭제하고 싶다면 deleteOne() 메서드를 사용하면 되고, deleteMany()DeleteResult 객체를 반환하므로 삭제된 문서의 개수를 확인할 수도 있습니다.

예제 코드

import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.bson.Document;
import org.bson.conversions.Bson;
import com.mongodb.MongoClient;

public class DeletingMultipleDocuments {
    public static void main( String args[] ) {
        // MongoDB 클라이언트 생성
        MongoClient mongo = new MongoClient( "localhost" , 27017 );
        // 데이터베이스에 연결
        MongoDatabase database = mongo.getDatabase("myDatabase");
        // 컬렉션 객체 생성
        MongoCollection<Document>collection = database.getCollection("students");

        Document document1 = new Document("name", "Ram").append("age", 26).append("city", "Delhi");
        Document document2 = new Document("name", "Robert").append("age", 27).append("city", "Vishakhapatnam");
        Document document3 = new Document("name", "Rhim").append("age", 30).append("city", "Delhi");
        Document document4 = new Document("name", "Radha").append("age", 45).append("city", "Delhi");
        Document document5 = new Document("name", "Sarmista").append("age", 35).append("city", "Mumbai");

        // 생성한 문서들을 삽입
        List<Document> list = new ArrayList<Document>();
        list.add(document1);
        list.add(document2);
        list.add(document3);
        list.add(document4);
        list.add(document5);
        collection.insertMany(list);
        System.out.println("Documents Inserted");

        System.out.println("Contents of the collection:");
        FindIterable<Document> iterDoc = collection.find();
        int i = 1;
        System.out.println("Remaining documents:");
        Iterator it = iterDoc.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
            i++;
        }

        collection = database.getCollection("students");
        // 여러 문서 삭제: city가 "Delhi"인 모든 문서를 대상으로 함
        Bson filter = new Document("city", "Delhi");
        collection.deleteMany(filter);
        System.out.println("Document deleted successfully...");

        // 삭제 작업 후 남은 문서 조회
        iterDoc = collection.find();
        System.out.println("Remaining documents:");
        it = iterDoc.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
            i++;
        }
    }
}

실행 결과

Documents Inserted
Contents of the collection:
Remaining documents:
Document{{_id=5e896b042e4a2f3badebddae, name=Ram, age=26, city=Delhi}}
Document{{_id=5e896b042e4a2f3badebddaf, name=Robert, age=27, city=Vishakhapatnam}}
Document{{_id=5e896b042e4a2f3badebddb0, name=Rhim, age=30, city=Delhi}}
Document{{_id=5e896b042e4a2f3badebddb1, name=Radha, age=45, city=Delhi}}
Document{{_id=5e896b042e4a2f3badebddb2, name=Sarmista, age=35, city=Mumbai}}
Document deleted successfully...
Remaining documents:
Document{{_id=5e896b042e4a2f3badebddaf, name=Robert, age=27, city=Vishakhapatnam}}
Document{{_id=5e896b042e4a2f3badebddb2, name=Sarmista, age=35, city=Mumbai}}

코드 설명

위 예제는 다음과 같은 순서로 동작합니다.

1. 문서 삽입: 이름, 나이, 도시 정보를 가진 5개의 문서를 생성한 뒤 insertMany()로 한꺼번에 삽입합니다.

2. 전체 문서 조회: find() 메서드로 컬렉션의 모든 문서를 출력하여 삭제 전 상태를 확인합니다.

3. 조건부 삭제: city 필드 값이 "Delhi"인 문서를 찾는 필터를 만들어 deleteMany()에 전달합니다. 그 결과 Ram, Rhim, Radha 세 개의 문서가 삭제됩니다.

4. 삭제 후 확인: 다시 find()를 실행하면 city가 Delhi가 아닌 Robert(Vishakhapatnam)와 Sarmista(Mumbai)의 문서만 남아 있는 것을 확인할 수 있습니다.

주의 사항

MongoDB Java 드라이버 4.x 이상 버전에서는 new MongoClient("localhost", 27017) 생성자가 deprecated(사용 중단 권고) 상태입니다. 최신 버전에서는 MongoClients.create("mongodb://localhost:27017") 방식을 사용하는 것이 좋습니다. 또한 실무 환경에서는 삭제 조건을 신중하게 설계해야 하며, 잘못된 필터(예: 빈 Document)를 전달하면 컬렉션의 모든 문서가 삭제될 수 있으므로 각별히 주의해야 합니다.