1. 개요
MongoDB 는 공개적으로 사용 가능한 문서 지향 NoSQL 데이터베이스입니다. update , replace 및 save 와 같은 다양한 방법을 사용하여 컬렉션의 문서를 업데이트할 수 있습니다 . 문서의 특정 필드를 변경하기 위해 $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 연산자는 job 및 department_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.BasicDBObject 및 org.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 의 구현은 키-값 쌍을 기반으로 합니다. BasicDBObject 는 util 패키지 에 있는 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_id 및 job 의 값을 업데이트했습니다 .
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 에서 찾을 수 있습니다 .