1. 개요

MongoDB 는 공개적으로 사용 가능한 문서 지향 NoSQL 데이터베이스입니다. update , replacesave 와 같은 다양한 방법을 사용하여 컬렉션의 문서를 업데이트할 수 있습니다 . 문서의 특정 필드를 변경하기 위해 $set , $inc  등과 같은 다른 연산자를 사용합니다 .

이 사용방법(예제)에서는 업데이트바꾸기 쿼리를 사용하여 문서의 여러 필드를 수정하는 방법을 배웁니다. 데모 목적으로 먼저 mongo 셸 쿼리에 대해 설명하고 Java에서 해당 구현에 대해 설명합니다.

이제 목적을 달성하기 위한 다양한 방법을 살펴보겠습니다.

2. 다른 필드를 업데이트하는 쉘 쿼리

시작하기 전에 먼저 새 데이터베이스인 baeldung 과 ​​샘플 컬렉션인 employee 를 생성하겠습니다 . 모든 예제에서 이 컬렉션을 사용합니다.

use baeldung;
db.createCollection(employee);

이제 insertMany 쿼리 를 사용하여 이 컬렉션에 몇 가지 문서를 추가해 보겠습니다 .

db.employee.insertMany([
    {
        "employee_id": 794875,
        "employee_name": "David Smith",
        "job": "Sales Representative",
        "department_id": 2,
        "salary": 20000,
        "hire_date": NumberLong("1643969311817")
    },
    {
        "employee_id": 794876,
        "employee_name": "Joe Butler",
        "job": "Sales Manager",
        "department_id": 3,
        "salary": 30000,
        "hire_date": NumberLong("1645338658000")
    }
]);

결과적으로 아래와 같이 두 문서 모두에 대해 ObjectId가 포함된 JSON을 얻게 됩니다.

{
    "acknowledged": true,
    "insertedIds": [
        ObjectId("6211e034b76b996845f3193d"),
        ObjectId("6211e034b76b996845f3193e")
        ]
}

지금까지 필요한 환경을 설정했습니다. 이제 방금 삽입한 문서를 업데이트하겠습니다.

2.1. 단일 문서의 여러 필드 업데이트

$set$inc 연산자를 사용하여 MongoDB의 모든 필드를 업데이트할 수 있습니다 . $set 연산자 는 새로 지정된 값을 설정하고 $inc 연산자는 지정된 값만큼 값을 증가시킵니다.

$set 연산자 를 사용하여 직원 컬렉션의 두 필드를 업데이트하는 MongoDB 쿼리를 먼저 살펴보겠습니다 .

db.employee.updateOne(
    {
        "employee_id": 794875,
        "employee_name": "David Smith"
    },
    {
        $set:{
            department_id:3,
            job:"Sales Manager"
        }
    }
);

위의 쿼리에서 employee_id  및 employee_name  필드는 문서를 필터링하는 데 사용되고 $set 연산자는 jobdepartment_id 필드를 업데이트하는 데 사용됩니다.

단일 업데이트 쿼리에서 $set$inc 연산자를 함께 사용할 수도 있습니다 .

db.employee.updateOne(
    {
        "employee_id": 794875
    },
    {
        $inc: {
            department_id: 1
        },
        $set: {
            job: "Sales Manager"
        }
    }
);

이렇게 하면 작업 필드가 영업 관리자로 업데이트되고 department_id 가 1씩 증가합니다.

2.2. 여러 문서의 여러 필드 업데이트

또한 MongoDB에서 둘 이상의 문서의 여러 필드를 업데이트할 수도 있습니다. 필터 쿼리 기준과 일치하는 모든 문서를 수정하려면 multi:true 옵션을 포함하기만 하면 됩니다 .

db.employee.update(
    {
        "job": "Sales Representative"
    },
    {
        $inc: { 
            salary: 10000
        }, 
        $set: { 
            department_id: 5
        }
    },
    {
        multi: true 
    }
);

또는 updateMany 쿼리 를 사용하여 동일한 결과를 얻을 수 있습니다.

db.employee.updateMany(
    {
        "job": "Sales Representative"
    },
    {
        $inc: {
            salary: 10000
        },
        $set: {
            department_id: 5
        }
    }
);

위의 쿼리에서 updateMany 메서드를 사용하여 컬렉션의 문서를 둘 이상 업데이트했습니다.

2.3. 여러 필드를 업데이트하는 동안 발생하는 일반적인 문제

지금까지 두 개의 서로 다른 연산자를 제공하거나 여러 필드에서 단일 연산자를 사용하여 업데이트 쿼리를 사용하여 여러 필드를 업데이트하는 방법을 배웠습니다.

이제 단일 쿼리에서 서로 다른 필드에 연산자를 여러 번 사용하면 MongoDB는 업데이트 쿼리의 마지막 문만 업데이트 하고 나머지는 무시합니다.

db.employee.updateMany(
    {
        "employee_id": 794875
    },
    {
        $set: {
            department_id: 3
        },
        $set: {
            job:"Sales Manager"
        }
    }
);

위 쿼리는 다음과 유사한 출력을 반환합니다.

{
    "acknowledged":true,
    "matchedCount":1,
    "modifiedCount":1
}

이 경우 유일한  작업 은 "영업 관리자"로 업데이트됩니다. department_id 값 은 3으로 업데이트되지 않습니다.

3. Java 드라이버로 필드 업데이트

지금까지 원시 MongoDB 쿼리에 대해 논의했습니다. 이제 Java를 사용하여 동일한 작업을 수행해 보겠습니다 . MongoDB Java 드라이버는 MongoDB 문서를 나타내는 두 가지 클래스인 com.mongodb.BasicDBObjectorg.bson.Document를 지원합니다. 문서의 필드를 업데이트하는 두 가지 방법을 살펴보겠습니다.

진행하기 전에 먼저 baeldung DB 내부의 직원 컬렉션에 연결해 보겠습니다.

MongoClient mongoClient = new MongoClient(new MongoClientURI("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("baeldung");
MongoCollection<Document> collection = database.getCollection("employee");

여기서는 MongoDB가 기본 포트 27017에서 로컬로 실행된다고 가정했습니다.

3.1. DBObject 사용

MongoDB에서 문서를 생성하기 위해 com.mongodb를 사용합니다. DBObject 인터페이스 및 해당 구현 클래스 com.mongodb.BasicDBObject .

DBObject 의 구현은 키-값 쌍을 기반으로 합니다. BasicDBObjectutil 패키지 에 있는 LinkedHashMap 클래스 에서 상속 됩니다.

이제 com.mongodb.BasicDBObject  를 사용하여 여러 필드에서 업데이트 작업을 수행해 보겠습니다.

BasicDBObject searchQuery = new BasicDBObject("employee_id", 794875);
BasicDBObject updateFields = new BasicDBObject();
updateFields.append("department_id", 3);
updateFields.append("job", "Sales Manager");
BasicDBObject setQuery = new BasicDBObject();
setQuery.append("$set", updateFields);
UpdateResult updateResult = collection.updateMany(searchQuery, setQuery);

여기에서 먼저 employee_id를 기반으로 필터 쿼리를 만들었습니다. 이 작업은 일련의 문서를 반환합니다. 또한 설정된 쿼리에 따라 department_idjob 의 값을 업데이트했습니다 .

3.2. bson 문서 사용

bson 문서 를 사용하여 모든 MongoDB 작업을 수행할 수 있습니다 . 이를 위해 먼저 컬렉션 ​​개체가 필요한 다음 필터설정 함수 와 함께 updateMany 메서드를 사용하여 업데이트 작업을 수행합니다.

UpdateResult updateQueryResult = collection.updateMany(Filters.eq("employee_id", 794875),
Updates.combine(Updates.set("department_id", 3), Updates.set("job", "Sales Manager")));

여기에서는 쿼리 필터를 updateMany 메서드에 전달합니다. eq 필터는 employee_id 정확히 일치하는 텍스트 '794875'와 일치시킵니다. 그런 다음 집합 연산자 를 사용하여 department_id작업 을 업데이트합니다.

4. 바꾸기 쿼리 사용

문서의 여러 필드를 업데이트하는 순진한 접근 방식은 업데이트된 값이 있는 새 문서로 바꾸는 것입니다.

예를 들어 문서를 employee_id  794875로 바꾸려는 경우 다음 쿼리를 실행할 수 있습니다.

db.employee.replaceOne(
    {
        "employee_id": 794875
    },
    {
        "employee_id": 794875,
        "employee_name": "David Smith",
        "job": "Sales Manager",
        "department_id": 3,
        "salary": 30000,
        "hire_date": NumberLong("1643969311817")
    }
);

위의 명령은 출력에 승인 JSON을 인쇄합니다.

{
    "acknowledged":true,
    "matchedCount":1,
    "modifiedCount":1
}

여기에서 employee_id  필드는 문서를 필터링하는 데 사용됩니다. 업데이트 쿼리의 두 번째 인수는 기존 문서를 대체할 문서를 나타냅니다.

위의 쿼리에서 우리는 replaceOne 을 수행 하고 있으므로 단일 문서만 해당 필터로 바꿉니다. 또는 모든 문서를 해당 필터 쿼리로 바꾸려면 updateMany 메서드를 사용해야 합니다.

5. 결론

이 기사에서는 MongoDB에서 문서의 여러 필드를 업데이트하는 다양한 방법을 살펴보았습니다. 우리는 MongoDB 셸을 사용하는 것과 Java 드라이버를 사용하는 두 가지 구현에 대해 광범위하게 논의했습니다.

$inc $set  연산자 를 포함하여 문서의 여러 필드를 업데이트하는 다양한 옵션이 있습니다 .

이러한 모든 예제와 코드 스니펫의 구현은 GitHub 에서 찾을 수 있습니다 .

Persistence footer banner