웹사이트 검색

몽고DB findAndModify() 예제


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

몽고DB findAndModify()

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

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

매개변수에 대한 설명은 다음과 같습니다. 쿼리: 수정이 필요한 레코드에 대한 선택 기준을 정의합니다. 정렬: 선택 기준이 여러 문서를 검색할 때 수정해야 하는 문서를 결정합니다. new: 수정된 문서가 표시됨을 나타냅니다. fields: 반환할 필드 집합을 지정합니다. upsert: 선택 기준이 문서 검색에 실패하면 새 문서를 만듭니다.

MongoDB findAndModify 중요 사항

findAndModify MongoDB 호출을 사용하는 동안 염두에 두어야 할 몇 가지 사항은 다음과 같습니다.

  • 입력한 선택 기준이 문서를 가져오지 않고 upsert가 true로 설정된 경우 지정된 값이 삽입되고 새 문서가 생성됩니다.
  • 업데이트 또는 제거 작업을 수행하는 동안 입력한 선택 기준이 문서를 가져오지 않으면 반환되는 출력은 null입니다.
  • 새 옵션이 false로 설정되고 정렬 작업이 언급되지 않은 경우 반환되는 출력은 null입니다.
  • 새 옵션이 false로 설정되고 정렬 작업이 지정된 경우 출력이 비어 있습니다.

MongoDB findAndModify 예제

이제 findAndModify API의 사용법을 보여주는 몇 가지 예를 살펴보겠습니다. 먼저 시작할 테스트 데이터를 만들어 보겠습니다. mongo 콘솔을 통해 이름, 색상, 자동차 번호(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" }

찾기 및 수정의 실제 사용으로 이동하여 다양한 가능성을 설명합니다. 사례 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
}

속도는 new를 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 }

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

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

산출:

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

remove 필드는 이름이 "Alto”인 문서를 true로 설정하면 데이터베이스에서 삭제됩니다.

MongoDB findAndModify 자바 예제

위에 묘사된 작업은 모두 mongo shell을 사용하여 수동으로 수행됩니다. 아래와 같이 Java에서 프로그래밍 방식으로 동일한 작업을 수행할 수 있습니다. mongo 드라이버 jar를 다운로드하여 클래스 경로에 추가하십시오. 먼저 Mongo 클라이언트를 사용하여 mongodb 서버에 대한 연결을 설정해야 합니다. 연결을 위한 데이터베이스 이름을 매개변수로 지정해야 합니다. 데이터베이스가 없으면 새 데이터베이스가 생성됩니다. 그런 다음 데이터베이스에 몇 개의 레코드를 추가하고 findAndModify 작업을 수행한 다음 레코드가 실제로 업데이트되는지 확인합니다. 아래 프로그램은 mongo java 드라이버 버전 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 {
		// Get a new connection to the db assuming it is running.
		MongoClient mongoClient = new MongoClient("localhost");
		// use test as the database. Use your database here.
		DB db = mongoClient.getDB("test");

		DBCollection coll = db.getCollection("car");
		
		// insert some test data to start with.
		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 operation. Update colour to blue for cars having speed
		// < 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);
	}
}

산출:

//Test Data Before Insert
{ "_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"}


//Test Data After insert
{ "_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 Java 드라이버 버전 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 {
        // Get a new connection to the db assuming it is running.
        MongoClient mongoClient = new MongoClient("localhost");
        
        // use test as the database. Use your database here.
        MongoDatabase db = mongoClient.getDatabase("test");
 
        MongoCollection<Document> coll = db.getCollection("car");
         
        // insert some test data to start with.
        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 operation. Update color to blue for cars having speed > 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<Document> coll) {
		FindIterable<Document> cursor = coll.find();
        
		for (Document d : cursor)
			System.out.println(d);
	}
}