몽고디비 findAndModify() 예제

MongoDB findAndModify() 메소드는 입력한 선택 기준에 따라 단일 문서를 수정하고 반환합니다. 반환된 문서는 기본적으로 업데이트된 내용을 표시하지 않습니다. 데이터베이스에서 기준과 일치하는 레코드가 없는 경우, upsert가 true로 설정되어 있다면 새로운 레코드가 삽입됩니다.

MongoDB findAndModify()

mongodb findAndModify 메소드의 구문은 다음과 같습니다.

db.collection.findAndModify({
    query: <document>,
    sort: <document>,
    new: <boolean>,
    fields: <document>,
    upsert: <boolean>
})

매개변수 설명은 다음과 같습니다. query: 수정이 필요한 레코드를 선택하는 선택 기준을 정의합니다. sort: 선택 기준이 여러 문서를 검색할 때 수정할 문서를 결정합니다. new: 수정된 문서를 표시할지 여부를 나타냅니다. fields: 반환할 필드의 집합을 지정합니다. upsert: 선택 기준에 맞는 문서를 검색하지 못할 경우 새로운 문서를 생성합니다.

MongoDB findAndModify 중요 사항

findAndModify MongoDB 호출 시 유의해야 할 몇 가지 사항은 다음과 같습니다.

  • 만약 입력된 선택 기준이 문서를 검색하지 못하고 upsert가 true로 설정되어 있다면, 지정된 값이 삽입되고 새 문서가 생성됩니다.
  • 입력된 선택 기준이 문서를 검색하지 못하는 경우에는 업데이트 또는 삭제 작업 중에 결과가 null로 반환됩니다.
  • 새 옵션이 false로 설정되고 정렬 작업이 언급되지 않은 경우 결과는 null로 반환됩니다.
  • 새 옵션이 false로 설정되고 정렬 작업이 지정된 경우 결과는 비어 있습니다.

MongoDB findAndModify 예제

이제 findAndModify API 사용 예시를 몇 가지 살펴보겠습니다. 먼저 시작할 테스트 데이터를 만들어 보겠습니다. 몽고 콘솔을 통해 이름, 색상, 차량 번호(cno), 속도 및 제조 국가(mfdcountry) 필드가 있는 새 차량 문서를 만들겠습니다.

db.car.insert(
[
{ _id: 1, name: "Alto", color: "Red",cno: "H410",speed:40,mfdcountry: "India"},
{ _id: 2, name: "Polo", color: "White",cno: "H411",speed:45,mfdcountry: "Japan" },
{ _id: 3, name: "Audi", color: "Black",cno: "H412",speed:50,mfdcountry: "Germany" }
]
)

이제 실제로 데이터가 삽입되었는지 확인해 보겠습니다. mongodb find를 사용하여 :

db.car.find()
{ "_id" : 1, "name" : "Alto", "color" : "Red", "cno" : "H410", "speed" : 40, "mfdcountry" : "India" }
{ "_id" : 2, "name" : "Polo", "color" : "White", "cno" : "H411", "speed" : 45, "mfdcountry" : "Japan" }
{ "_id" : 3, "name" : "Audi", "color" : "Black", "cno" : "H412", "speed" : 50, "mfdcountry" : "Germany" }

find 및 modify의 실제 사용에 대해 다양한 가능성을 묘사하겠습니다. Case 1: 데이터베이스에 문서가 있는 경우

db.car.findAndModify({
query: { name: "Alto" },
sort: { cno: 1 },
update: { $inc: { speed: 10 } },
})
  1. 쿼리는 이름 필드가 Alto인 차량 컬렉션에서 문서를 찾습니다.
  2. 쿼리의 결과를 오름차순으로 정렬합니다. 여러 문서가 쿼리 조건을 만족하는 경우, 이 정렬에 의해 첫 번째 문서를 수정 대상으로 선택합니다.
  3. 업데이트는 속도 필드의 값을 10씩 증가시킵니다.
  4. 이 업데이트에 대해 선택된 원본 문서를 메소드가 반환합니다 :

출력:

{
"_id" : 1,
"name" : "Alto",
"color" : "Red",
"cno" : "H410",
"speed" : 40,
"mfdcountry" : "India"
}

사례 2: 새 옵션을 true로 설정 (업데이트된 데이터 세트 반환)

db.car.findAndModify({
query: { name: "HondaCity", color: "Silver", cno:"H415" ,speed: 25 },
sort: { cno: 1 },
update: { $inc: { speed: 20 } },
upsert: true,
new: true
})

출력:

{
"_id" : ObjectId("546c9f347256eabc40c9da1c"),
"cno" : "H415",
"color" : "Silver",
"name" : "HondaCity",
"speed" : 45
}

새로 설정을 true로 하였기 때문에 속도가 45로 표시되는 것을 주목하세요. 이것이 설정되지 않으면, 속도 필드는 업데이트 되어있음에도 불구하고 20, 즉 오래된 값으로 표시됩니다. 사례 3: upsert가 true로 설정됨

db.car.findAndModify({
query: { name: "WagonR" },
sort: { cno: 1 },
update: { $inc: { speed: 5 } },
upsert: <strong>true</strong>
})

출력:

db.car.find();
{ "_id" : 1, "name" : "Alto", "color" : "Red", "cno" : "H410", "speed" : 50, "mfdcountry" : "India" }
{ "_id" : 2, "name" : "Polo", "color" : "White", "cno" : "H411", "speed" : 45, "mfdcountry" : "Japan" }
{ "_id" : 3, "name" : "Audi", "color" : "Black", "cno" : "H412", "speed" : 50, "mfdcountry" : "Germany" }
{ "_id" : ObjectId("546c7c7d6be0faf69ee36546"), "name" : "WagonR", "speed" : 5 }

db에 WagonR이라는 차 이름이 없으므로 데이터베이스에 새 문서가 생성됩니다. 정렬 옵션이 지정된 경우 메소드는 빈 문서 {}를 반환합니다. 정렬 옵션이 포함되지 않으면 메소드는 null을 반환합니다. 이 외에도 정렬 및 제거 작업을 수행하는 데 사용될 수 있습니다. 제거 필드가 true로 설정되면, 지정된 기준에 맞는 차 이름이 데이터베이스에서 제거됩니다.

db.car.findAndModify(
{
query: { name: "Alto" },
sort: { cno: 1 },
remove: true
}
)

출력:

{
"_id" : 1,
"name" : "Alto",
"color" : "Red",
"cno" : "H410",
"speed" : 50,
"mfdcountry" : "India"
}

제거 필드가 true로 설정되어 “Alto”라는 이름의 문서가 데이터베이스에서 삭제됩니다.

MongoDB findAndModify 자바 예제

위에 그림으로 나타낸 작업은 모두 몽고 쉘을 사용하여 수동으로 수행됩니다. 동일한 작업을 Java로 프로그래밍적으로 수행할 수 있습니다. 몽고 드라이버 jar 파일을 다운로드하고 클래스 경로에 추가해야 합니다. 먼저, 몽고 클라이언트를 사용하여 mongodb 서버에 연결해야 합니다. 연결을 위해 데이터베이스의 이름을 매개변수로 지정해야 합니다. 데이터베이스가 존재하지 않으면 새로운 데이터베이스가 생성됩니다. 이후에는 데이터베이스에 몇 개의 레코드를 추가하고 findAndModify 작업을 수행한 다음 레코드가 실제로 업데이트되었는지 확인합니다. 아래 프로그램은 몽고 자바 드라이버 버전 2.x와 함께 작동합니다.

package com.journaldev.mongodb;

import java.net.UnknownHostException;

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.MongoClient;

public class MongoDBFindAndModify {

	public static void main(String[] args) throws UnknownHostException {
		// db에 대한 새로운 연결 생성
		MongoClient mongoClient = new MongoClient("localhost");
		// 데이터베이스로 "test" 사용. 여기에서 데이터베이스를 사용하세요.
		DB db = mongoClient.getDB("test");

		DBCollection coll = db.getCollection("car");
		
		// 몇 가지 테스트 데이터 삽입
		BasicDBObject obj = new BasicDBObject();
		obj.append("name", "Volkswagen");
		obj.append("color", "JetBlue");
		obj.append("cno", "H672");
		obj.append("speed", 62);
		obj.append("mfdcountry", "Italy");
		coll.insert(obj);
		
		// findAndModify 작업. 속도
		//가 45보다 작은 차량의 색상을 파란색으로 업데이트
		DBObject query = new BasicDBObject("speed",
				new BasicDBObject("$lt", 45));
		DBObject update = new BasicDBObject();
		update.put("$set", new BasicDBObject("color", "Blue"));
		DBCursor cursor = coll.find();
		try {
			while (cursor.hasNext()) {
				System.out.println(cursor.next());
			}
		} finally {
			cursor.close();
		}
		coll.findAndModify(query, update);
	}
}

출력:

// 삽입 전 테스트 데이터
{ "_id" : 2.0 , "name" : "Polo" , "color" : "White" , "cno" : "H411" , "speed" : 45.0 , "mfdcountry" : "Japan"}
{ "_id" : 3.0 , "name" : "Audi" , "color" : "Black" , "cno" : "H412" , "speed" : 50.0 , "mfdcountry" : "Germany"}


// 삽입 후 테스트 데이터
{ "_id" : 2.0 , "name" : "Polo" , "color" : "White" , "cno" : "H411" , "speed" : 45.0 , "mfdcountry" : "Japan"}
{ "_id" : 3.0 , "name" : "Audi" , "color" : "Black" , "cno" : "H412" , "speed" : 50.0 , "mfdcountry" : "Germany"}
{ "_id" : { "$oid" : "546cc76093f404729e2e946e"} , "name" : "Volkswagen" , "color" : "JetBlue" , "cno" : "H672" , "speed" : 62 , "mfdcountry" : "Italy"}


/*Test Data Before findandModify
{ "_id" : 2.0 , "name" : "Polo" , "color" : "White" , "cno" : "H411" , "speed" : 45.0 , "mfdcountry" : "Japan"}
{ "_id" : 3.0 , "name" : "Audi" , "color" : "Black" , "cno" : "H412" , "speed" : 50.0 , "mfdcountry" : "Germany"}
{ "_id" : { "$oid" : "546cc76093f404729e2e946e"} , "name" : "Volkswagen" , "color" : "JetBlue" , "cno" : "H672" , "speed" : 62 , "mfdcountry" : "Italy"}
{ "_id" : { "$oid" : "546c7c7d6be0faf69ee36546"} , "name" : "WagonR" , "speed" : 5.0}


/*Test Data After findAndModify
{ "_id" : 2.0 , "name" : "Polo" , "color" : "White" , "cno" : "H411" , "speed" : 45.0 , "mfdcountry" : "Japan"}
{ "_id" : 3.0 , "name" : "Audi" , "color" : "Black" , "cno" : "H412" , "speed" : 50.0 , "mfdcountry" : "Germany"}
{ "_id" : { "$oid" : "546cc76093f404729e2e946e"} , "name" : "Volkswagen" , "color" : "JetBlue" , "cno" : "H672" , "speed" : 62 , "mfdcountry" : "Italy"}
{ "_id" : { "$oid" : "546c7c7d6be0faf69ee36546"} , "name" : "WagonR" , "speed" : 5.0 , "color" : "Blue"}

만약 MongoDB 자바 드라이버 버전 3.x를 사용한다면, 아래 프로그램을 사용하세요.

package com.journaldev.mongodb.main;

import java.net.UnknownHostException;

import org.bson.Document;
import org.bson.conversions.Bson;

import com.mongodb.MongoClient;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
 
public class MongoDBFindAndModify {
 
    public static void main(String[] args) throws UnknownHostException {
        // db에 대한 새로운 연결 생성
        MongoClient mongoClient = new MongoClient("localhost");
        
        // 데이터베이스로 "test" 사용. 여기에서 데이터베이스를 사용하세요.
        MongoDatabase db = mongoClient.getDatabase("test");
 
        MongoCollection coll = db.getCollection("car");
         
        // 몇 가지 테스트 데이터 삽입
        Document obj = new Document();
        obj.append("name", "Volkswagen");
        obj.append("color", "JetBlue");
        obj.append("cno", "H672");
        obj.append("speed", 62);
        obj.append("mfdcountry", "Italy");
        coll.insertOne(obj);
         
        // findAndModify 작업. 속도가 45보다 큰 차량의 색상을 파란색으로 업데이트합니다.
        Bson query = new Document("speed",
                new Document("$gt", 45));
        Bson update = new Document("$set", 
        			new Document("color", "Blue"));
        
        System.out.println("before update");
        findAndPrint(coll);
        
        coll.findOneAndUpdate(query, update);
        
        System.out.println("after update of color field");
        findAndPrint(coll);
        
        mongoClient.close();

    }

	private static void findAndPrint(MongoCollection coll) {
		FindIterable cursor = coll.find();
        
		for (Document d : cursor)
			System.out.println(d);
	}
}

위의 프로그램의 출력을 나타내는 이미지를 아래에서 볼 수 있습니다. 색상 필드의 변경에 주목하세요. 이것이 MongoDB findAndModify 예제에 대한 모든 내용입니다. 다음 게시물에서는 MongoDB의 더 많은 작업을 살펴보겠습니다. 참고: MongoDB 공식 문서

Source:
https://www.digitalocean.com/community/tutorials/mongodb-findandmodify-example