Java를 사용하여 MongoDB에서 문서 대량 업데이트

Mehvish Ashiq 2023년10월12일
  1. 전제 조건
  2. Java를 사용하여 MongoDB에서 문서 대량 업데이트
  3. updateMany()를 사용하여 기존 문서에 새 필드를 추가하여 대량 업데이트 수행
  4. updateMany()를 사용하여 필터와 일치하는 여러 문서에서 기존 필드의 대량 업데이트 수행
  5. updateMany()를 사용하여 필터와 일치하는 포함된 문서에 대량 업데이트 수행
  6. bulkWrite() API를 사용하여 필터 쿼리와 일치하는 기존 문서 업데이트
Java를 사용하여 MongoDB에서 문서 대량 업데이트

이 튜토리얼은 Java 드라이버를 사용하여 MongoDB에서 문서의 대량 업데이트를 수행하는 방법에 관한 것입니다. 또한 새 필드를 추가하거나 기존 필드 또는 배열의 값을 변경하거나 문서를 삭제하여 업데이트하는 방법을 배웁니다.

전제 조건

이 자습서에서는 따라야 하는 다음 도구를 사용합니다.

  1. 자바(자바 18.0.1.1 사용)
  2. MongoDB 서버(MongoDB 5.0.8 사용)
  3. 코드 편집기 또는 모든 Java IDE(Apache NetBeans IDE 13 사용)
  4. Maven 또는 Gradle을 사용하는 Mongo Java 드라이버 종속성 우리는 Maven과 함께 사용하고 있습니다.

Java를 사용하여 MongoDB에서 문서 대량 업데이트

대량 업데이트는 데이터베이스 내에서 여러 문서를 업데이트해야 할 때 유용합니다. 이제 문제는 문서를 어떻게 업데이트할까요?

새 필드를 추가하거나 기존 필드 또는 배열의 값을 업데이트하거나 문서를 삭제하여 업데이트하시겠습니까? 이 모든 시나리오를 배우기 위해 컬렉션을 만들고 두 개의 문서를 삽입해 보겠습니다.

컬렉션 만들기:

db.createCollection('supervisor');

첫 번째 문서 삽입:

db.supervisor.insertOne(
    {
          "firstname": "Mehvish",
          "lastname": "Ashiq",
          "gender": "Female",
          "contact" : {
              "email":"mehvishofficial@gmail.com",
              "phone" : [
                  {
                      "type" : "official",
                      "number" : "123456789"
                  },
                  {
                       "type" : "personal",
                       "number" : "124578369"
                  },
               ]
          },
          "entries" : [
              { "_id" : 1, "itemsperday" : [ 1,3,4,5,6,7 ] },
              { "_id" : 2, "itemperday" : [ 2,3,4,5,2,7 ] },
              { "_id" : 3, "itemperday" : [ 5,0,0,4,0,1 ] }
           ]
    }
);

두 번째 문서 삽입:

db.supervisor.insertOne(
    {
          "firstname": "Tahir",
          "lastname": "Raza",
          "gender": "Male",
          "contact" : {
              "email":"tahirraza@gmail.com",
              "phone" : [
                  {
                      "type" : "official",
                      "number" : "123478789"
                  },
                  {
                       "type" : "personal",
                       "number" : "122378369"
                  },
               ]
          },
          "entries" : [
              { "_id" : 1, "itemsperday" : [ 4,5,6,7,4,6 ] },
              { "_id" : 2, "itemperday" : [ 2,3,2,7,5,2 ] },
              { "_id" : 3, "itemperday" : [ 5,0,0,1,0,0 ] }
           ]
    }
);

컬렉션을 채우고 나면 db.supervisor.find().pretty();를 사용할 수 있습니다. 삽입된 문서를 볼 수 있습니다. 우리는 쉬운 해결책부터 시작하여 조금 까다롭지만 흥미로운 해결책으로 나아갈 것입니다.

updateMany()를 사용하여 기존 문서에 새 필드를 추가하여 대량 업데이트 수행

예제 코드:

// write your package where you want to save your source file
package com.voidtesting.javamongobulkupdateexample;

// import necessary libraries
import com.mongodb.BasicDBObject;
import com.mongodb.MongoException;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;

// Example_1
public class Example_1 {
  // main method
  public static void main(String[] args) {
    // Replace the connection string with your own connection string
    var uri = "mongodb://localhost:27017";

    // try block
    try (MongoClient mongoClient = MongoClients.create(uri)) {
      // print message if connection is successfully established
      System.out.println("Connected successfully to server.");

      // get the specified database from the MongoDB server
      MongoDatabase database = mongoClient.getDatabase("bulkUpdate");

      // get the specified collection from the selected database
      MongoCollection<Document> collection = database.getCollection("supervisor");

      // update documents by adding a new field and its value
      collection.updateMany(
          new BasicDBObject(), new BasicDBObject("$set", new BasicDBObject("status", "Good")));

      // print a new line
      System.out.println();

      // iterate over all documents of the selected collection
      // to print in Java IDE
      collection.find().forEach(doc -> {
        System.out.println(doc.toBsonDocument());
        System.out.println();
      }); // end forEach

    } // end try block

    // print error if unable to execute a command
    catch (MongoException error) {
      System.err.println("An error occurred while running a command: " + error);
    } // end catch block

  } // end main method
} // end Example_1

출력:

{
    "_id": {"$oid": "62a866e592fd89ad9c4932ed"},
    "firstname": "Mehvish",
    "lastname": "Ashiq",
    "gender": "Female",
    "contact": {
        "email": "mehvishofficial@gmail.com",
        "phone": [
            { "type": "official", "number": "123456789"},
            {"type": "personal", "number": "124578369"}
         ]
     },
     "entries": [
         {"_id": 1.0, "itemsperday": [1.0, 3.0, 4.0, 5.0, 6.0, 7.0]},
         {"_id": 2.0, "itemperday": [2.0, 3.0, 4.0, 5.0, 2.0, 7.0]},
         {"_id": 3.0, "itemperday": [5.0, 0.0, 0.0, 4.0, 0.0, 1.0]}
     ],
     "status": "Good"
}

{
    "_id": {"$oid": "62a8670192fd89ad9c4932ee"},
    "firstname": "Tahir",
    "lastname": "Raza",
    "gender": "Male",
    "contact": {
        "email": "tahirraza@gmail.com",
        "phone": [
            {"type": "official", "number": "123478789"},
            {"type": "personal", "number": "122378369"}
         ]
     },
     "entries": [
         {"_id": 1.0, "itemsperday": [4.0, 5.0, 6.0, 7.0, 4.0, 6.0]},
         {"_id": 2.0, "itemperday": [2.0, 3.0, 2.0, 7.0, 5.0, 2.0]},
         {"_id": 3.0, "itemperday": [5.0, 0.0, 0.0, 1.0, 0.0, 0.0]}
     ],
     "status": "Good"
}

우리는 당신을 위해 출력을 포맷했지만(위에 주어진), IDE에서 한 줄에 하나의 문서를 보게 될 것입니다. db.supervisor.find().pretty();를 사용할 수도 있습니다. mongo 셸에서 업데이트된 문서를 확인하세요.

이 예제 코드에서는 filter 쿼리와 update 문을 사용하여 일치하는 문서를 업데이트하는 mongo 컬렉션 개체의 updateMany() 메서드를 사용합니다. 여기에서 문서를 필터링하는 것이 아니라 status라는 새 필드를 모든 기존 문서에 추가합니다(위에 제공된 출력 참조).

updateMany()를 사용하여 필터와 일치하는 여러 문서에서 기존 필드의 대량 업데이트 수행

예제 코드:

// write your package where you want to save your source file
package com.voidtesting.javamongobulkupdateexample;

// import necessary libraries
import static com.mongodb.client.model.Filters.eq;
import static com.mongodb.client.model.Updates.combine;
import static com.mongodb.client.model.Updates.set;

import com.mongodb.MongoException;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;

// Example_2
public class Example_2 {
  // main method
  public static void main(String[] args) {
    // Replace the connection string with your own connection string
    var uri = "mongodb://localhost:27017";

    // try block
    try (MongoClient mongoClient = MongoClients.create(uri)) {
      // print message if connection is successfully established
      System.out.println("Connected successfully to server.");

      // get the specified database from the MongoDB server
      MongoDatabase database = mongoClient.getDatabase("bulkUpdate");

      // get the specified collection from the selected database
      MongoCollection<Document> collection = database.getCollection("supervisor");

      // update the filtered documents by updating the existing field
      collection.updateMany(eq("gender", "Female"), combine(set("gender", "F")));
      collection.updateMany(eq("gender", "Male"), combine(set("gender", "M")));

      System.out.println();
      // iterate over all documents of the selected collection
      // to print in Java IDE
      collection.find().forEach(doc -> {
        System.out.println(doc.toBsonDocument());
        System.out.println();
      }); // end forEach

    } // end try block

    // print error if unable to execute a command
    catch (MongoException error) {
      System.err.println("An error occurred while running a command: " + error);
    } // end catch block

  } // end main method
} // end Example_2

출력:

{
    "_id": {"$oid": "62a866e592fd89ad9c4932ed"},
    "firstname": "Mehvish",
    "lastname": "Ashiq",
    "gender": "F",
    "contact": {
        "email": "mehvishofficial@gmail.com",
        "phone": [
            { "type": "official", "number": "123456789"},
            {"type": "personal", "number": "124578369"}
         ]
     },
     "entries": [
         {"_id": 1.0, "itemsperday": [1.0, 3.0, 4.0, 5.0, 6.0, 7.0]},
         {"_id": 2.0, "itemperday": [2.0, 3.0, 4.0, 5.0, 2.0, 7.0]},
         {"_id": 3.0, "itemperday": [5.0, 0.0, 0.0, 4.0, 0.0, 1.0]}
     ],
     "status": "Good"
}

{
    "_id": {"$oid": "62a8670192fd89ad9c4932ee"},
    "firstname": "Tahir",
    "lastname": "Raza",
    "gender": "M",
    "contact": {
        "email": "tahirraza@gmail.com",
        "phone": [
            {"type": "official", "number": "123478789"},
            {"type": "personal", "number": "122378369"}
         ]
     },
     "entries": [
         {"_id": 1.0, "itemsperday": [4.0, 5.0, 6.0, 7.0, 4.0, 6.0]},
         {"_id": 2.0, "itemperday": [2.0, 3.0, 2.0, 7.0, 5.0, 2.0]},
         {"_id": 3.0, "itemperday": [5.0, 0.0, 0.0, 1.0, 0.0, 0.0]}
     ],
     "status": "Good"
}

이 코드 예제는 이전 예제와 유사하지만 필터와 일치하는 모든 문서에서 특정 필드 값을 업데이트하고 있습니다.

updateMany()를 사용하여 genderFemale과 같고 genderMale과 동일한 모든 문서에 대한 일괄 업데이트를 수행하고 있습니다. "gender": "Female""gender": "Male"을 각각 "gender":"F""gender":"M"으로 변경합니다.

지금까지 updateMany() 메서드를 사용하여 첫 번째 수준에서 새 필드를 추가하거나 기존 필드 값을 업데이트하는 방법을 살펴보았습니다. 다음으로 updateMany()를 사용하여 필터 쿼리를 충족하는 포함된 문서에 대한 대량 업데이트를 수행하는 방법을 배웁니다.

updateMany()를 사용하여 필터와 일치하는 포함된 문서에 대량 업데이트 수행

예제 코드:

// write your package where you want to save your source file
package com.voidtesting.javamongobulkupdateexample;

// import necessary libraries
import com.mongodb.MongoException;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.UpdateOptions;
import org.bson.Document;
import org.bson.conversions.Bson;

// Example_3
public class Example_3 {
  // main method
  public static void main(String[] args) {
    // Replace the connection string with your own connection string
    var uri = "mongodb://localhost:27017";

    // try block
    try (MongoClient mongoClient = MongoClients.create(uri)) {
      // print message if connection is successfully established
      System.out.println("Connected successfully to server.");

      // get the specified database from the MongoDB server
      MongoDatabase database = mongoClient.getDatabase("bulkUpdate");

      // get the specified collection from the selected database
      MongoCollection<Document> collection = database.getCollection("supervisor");
      // filter
      Bson where = new Document().append("contact.phone.type", "official");
      // update
      Bson update = new Document().append("contact.phone.$.type", "assistant");
      // set
      Bson set = new Document().append("$set", update);

      // update collection
      collection.updateMany(where, set, new UpdateOptions());

      // iterate over all documents of the selected collection
      // to print in Java IDE
      collection.find().forEach(doc -> {
        System.out.println(doc.toBsonDocument());
        System.out.println();
      }); // end forEach

    } // end try block

    // print error if unable to execute a command
    catch (MongoException error) {
      System.err.println("An error occurred while running a command: " + error);
    } // end catch block

  } // end main method
} // end Example_3

출력:

{
    "_id": {"$oid": "62a866e592fd89ad9c4932ed"},
    "firstname": "Mehvish",
    "lastname": "Ashiq",
    "gender": "F",
    "contact": {
        "email": "mehvishofficial@gmail.com",
        "phone": [
            { "type": "assistant", "number": "123456789"},
            {"type": "personal", "number": "124578369"}
         ]
     },
     "entries": [
         {"_id": 1.0, "itemsperday": [1.0, 3.0, 4.0, 5.0, 6.0, 7.0]},
         {"_id": 2.0, "itemperday": [2.0, 3.0, 4.0, 5.0, 2.0, 7.0]},
         {"_id": 3.0, "itemperday": [5.0, 0.0, 0.0, 4.0, 0.0, 1.0]}
     ],
     "status": "Good"
}

{
    "_id": {"$oid": "62a8670192fd89ad9c4932ee"},
    "firstname": "Tahir",
    "lastname": "Raza",
    "gender": "M",
    "contact": {
        "email": "tahirraza@gmail.com",
        "phone": [
            {"type": "assistant", "number": "123478789"},
            {"type": "personal", "number": "122378369"}
         ]
     },
     "entries": [
         {"_id": 1.0, "itemsperday": [4.0, 5.0, 6.0, 7.0, 4.0, 6.0]},
         {"_id": 2.0, "itemperday": [2.0, 3.0, 2.0, 7.0, 5.0, 2.0]},
         {"_id": 3.0, "itemperday": [5.0, 0.0, 0.0, 1.0, 0.0, 0.0]}
     ],
     "status": "Good"
}

이 Java 프로그램에서 updateMany() 메서드를 사용하여 필터 쿼리와 일치하는 포함된 문서에 대한 대량 업데이트를 수행합니다.

여기에서 contact.phone.type의 값을 official에서 assistant로 업데이트합니다. 문서 배열에 액세스하기 위해 위치 연산자 ($)를 사용하여 필터 쿼리를 충족하는 첫 번째 배열 값을 업데이트합니다.

위치 연산자를 사용하는 동안 업데이트해야 하는 배열 요소를 지정할 수도 있습니다. 업데이트할 첫 번째, 전체 또는 특정 배열 요소를 지정할 수 있습니다.

위치 연산자를 통해 배열 요소를 지정하기 위해 BSON 개체를 탐색하기 위한 속성 액세스 구문인 점 표기법을 사용합니다. 다음과 같은 방법으로 위치 연산자를 사용하여 첫 번째, 전체 또는 지정된 배열 요소를 업데이트합니다.

  1. 위치 연산자($)를 사용하여 필터 쿼리를 충족하는 배열의 첫 번째 요소를 업데이트하는 반면 배열 필드는 위치 연산자를 사용하기 위해 필터 쿼리의 일부여야 합니다.

  2. 모든 위치 연산자($[])를 사용하여 배열의 모든 항목(요소)을 업데이트합니다.

  3. 필터링된 위치 연산자($[<식별자>])는 필터 쿼리와 일치하는 배열 요소를 업데이트하는 데 사용됩니다. 여기서 업데이트 작업에 배열 필터를 포함하여 업데이트해야 하는 배열 요소를 알려야 합니다.

    <identifier>는 배열 필터에 부여한 이름임을 기억하십시오. 이 값은 소문자로 시작해야 하며 영숫자 문자만 포함해야 합니다.

bulkWrite() API를 사용하여 필터 쿼리와 일치하는 기존 문서 업데이트

예제 코드:

// write your package where you want to save your source file
package com.voidtesting.javamongobulkupdateexample;

// import necessary libraries
import com.mongodb.MongoException;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.DeleteOneModel;
import com.mongodb.client.model.UpdateManyModel;
import com.mongodb.client.model.WriteModel;
import java.util.ArrayList;
import java.util.List;
import org.bson.Document;

// Example_4
public class Example_4 {
  // main method
  public static void main(String[] args) {
    // Replace the connection string with your own connection string
    var uri = "mongodb://localhost:27017";

    // try block
    try (MongoClient mongoClient = MongoClients.create(uri)) {
      // print message if connection is successfully established
      System.out.println("Connected successfully to server.");

      // get the specified database from the MongoDB server
      MongoDatabase database = mongoClient.getDatabase("bulkUpdate");

      // get the specified collection from the selected database
      MongoCollection<Document> collection = database.getCollection("supervisor");

      // create object
      List<WriteModel<Document>> writes = new ArrayList<>();

      // delete the document matching the filter
      writes.add(new DeleteOneModel<>(new Document("firstname", "Tahir")));

      // update document matching the filter
      writes.add(new UpdateManyModel<>(new Document("status", "Good"), // filter
          new Document("$set", new Document("status", "Excellent")) // update
          ));

      // bulk write
      collection.bulkWrite(writes);

      // iterate over all documents of the selected collection
      // to print in Java IDE
      collection.find().forEach(doc -> {
        System.out.println(doc.toBsonDocument());
        System.out.println();
      }); // end forEach

    } // end try block
    catch (MongoException me) {
      System.err.println("An error occurred while running a command: " + me);
    } // end catch block
  } // end main method

} // end Example_4

출력:

{
    "_id": {"$oid": "62a866e592fd89ad9c4932ed"},
    "firstname": "Mehvish",
    "lastname": "Ashiq",
    "gender": "F",
    "contact": {
        "email": "mehvishofficial@gmail.com",
        "phone": [
            {"type": "assistant", "number": "123456789"},
            {"type": "personal", "number": "124578369"}
        ]
     },
     "entries": [
         {"_id": 1.0, "itemsperday": [1.0, 3.0, 4.0, 5.0, 6.0, 7.0]},
         {"_id": 2.0, "itemperday": [2.0, 3.0, 4.0, 5.0, 2.0, 7.0]},
         {"_id": 3.0, "itemperday": [5.0, 0.0, 0.0, 4.0, 0.0, 1.0]}
     ],
     "status": "Excellent"
}

이 예에서는 [bulkWrite()](https://mongodb.github.io/mongo-java-driver/4.6/apidocs/mongodb-driver-sync/com/mongodb/client/MongoCollection.html#bulkWrite(java.util.List,com.mongodb.client.model.BulkWriteOptions) API를 사용하여 여러 작업(삭제 및 업데이트)을 한 번에 수행합니다. DeleteOneModel()은 필터와 일치하는 문서를 삭제하는 데 사용되는 반면 UpdateManyModel()은 필터와 일치하는 모든 문서의 기존 필드 값을 업데이트하는 데 사용됩니다.

Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook

관련 문장 - MongoDB Java