쓰기 작업
이 페이지의 내용
쓰기 작업을 수행하여 새 문서를 삽입하거나, 기존 문서를 업데이트하거나, 기존 문서를 바꾸거나, 컬렉션에서 기존 문서를 삭제할 수 있습니다.
전제 조건
이 가이드의 코드 예제를 실행하려면 다음 구성 요소를 설정해야 합니다.
test.restaurants
restaurants.json
문서 자산 에 있는 파일의 문서로 채워진 컬렉션입니다.Github다음 가져오기 문:
import com.mongodb.*; import com.mongodb.client.MongoClients; import com.mongodb.client.MongoClient; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import com.mongodb.client.model.Filters; import static com.mongodb.client.model.Filters.*; import static com.mongodb.client.model.Updates.*; import com.mongodb.client.model.UpdateOptions; import com.mongodb.client.result.*; import org.bson.Document; import org.bson.types.ObjectId; import java.util.List; import java.util.Arrays; import java.util.ArrayList;
중요
이 가이드에서는 퀵 스타트 프라이머에 설명된 Subscriber
구현을 사용합니다.
MongoDB 배포에 연결하기
먼저 MongoDB deployment에 연결한 다음 MongoDatabase
및 MongoCollection
인스턴스를 선언하고 정의합니다.
다음 코드는 포트 27017
의 localhost
에서 실행되는 독립형 MongoDB 배포서버에 연결합니다. 그런 다음 test
데이터베이스를 참조하는 database
변수와 restaurants
컬렉션을 참조하는 collection
변수를 정의합니다.
MongoClient mongoClient = MongoClients.create(); MongoDatabase database = mongoClient.getDatabase("test"); MongoCollection<Document> collection = database.getCollection("restaurants");
MongoDB deployment에 연결하는 방법에 대해 자세히 알아보려면 MongoDB에 연결 튜토리얼을 참조하세요.
문서 삽입
컬렉션에 단일 문서를 삽입하려면 컬렉션의 insertOne()
메서드를 사용할 수 있습니다.
Document document = new Document("name", "Café Con Leche") .append("contact", new Document("phone", "228-555-0149") .append("email", "cafeconleche@example.com") .append("location",Arrays.asList(-73.92502, 40.8279556))) .append("stars", 3) .append("categories", Arrays.asList("Bakery", "Coffee", "Pastries")); collection.insertOne(document).subscribe(new ObservableSubscriber<Void>());
참고
문서에 최상위 id
필드가 지정되지 않은 경우 MongoDB는 자동으로 값을 생성하고 이 필드를 삽입된 문서에 추가합니다.
여러 문서를 삽입합니다.
여러 문서를 삽입하려면 삽입할 문서 목록을 매개 변수로 사용하는 collection의 insertMany()
메서드를 사용할 수 있습니다.
다음 예제에서는 컬렉션에 두 개의 문서를 삽입합니다.
Document doc1 = new Document("name", "Amarcord Pizzeria") .append("contact", new Document("phone", "264-555-0193") .append("email", "amarcord.pizzeria@example.net") .append("location",Arrays.asList(-73.88502, 40.749556))) .append("stars", 2) .append("categories", Arrays.asList("Pizzeria", "Italian", "Pasta")); Document doc2 = new Document("name", "Blue Coffee Bar") .append("contact", new Document("phone", "604-555-0102") .append("email", "bluecoffeebar@example.com") .append("location",Arrays.asList(-73.97902, 40.8479556))) .append("stars", 5) .append("categories", Arrays.asList("Coffee", "Pastries")); List<Document> documents = new ArrayList<Document>(); documents.add(doc1); documents.add(doc2); collection.insertMany(documents).subscribe(new ObservableSubscriber<Void>());;
참고
문서에 최상위 id
필드가 지정되지 않은 경우 MongoDB는 자동으로 값을 생성하고 이 필드를 삽입된 문서에 추가합니다.
기존 문서 업데이트
컬렉션의 기존 문서를 업데이트하려면 컬렉션의 updateOne()
또는 updateMany()
메서드를 사용할 수 있습니다.
필터
필터 문서를 메서드에 전달하여 업데이트할 문서를 지정할 수 있습니다. 필터 문서 사양은 읽기 작업과 동일합니다. 필터 객체를 쉽게 만들 수 있도록 드라이버는 Filters
헬퍼 클래스를 제공합니다.
빈 필터를 지정하고 컬렉션의 모든 문서를 일치시키려면 빈 Document
객체를 필터로 사용합니다.
연산자 업데이트
문서의 필드를 변경하기 위해 MongoDB는 업데이트 연산자를 제공합니다. 업데이트 연산자를 사용하여 수행할 수정을 지정하려면 업데이트 문서를 만듭니다. 업데이트 연산자에 대해 자세히 알아보려면 MongoDB Server 매뉴얼에서 업데이트 연산자를 참조하세요.
업데이트 문서를 쉽게 만들 수 있도록 드라이버는 Updates
도우미 클래스를 제공합니다.
중요
id
필드는 변경할 수 없으므로 문서에서 id
필드의 값을 변경할 수 없습니다.
단일 문서 업데이트
updateOne()
메서드는 필터 조건이 컬렉션의 여러 문서와 일치하더라도 단일 문서를 업데이트합니다.
restaurants
컬렉션에 대한 다음 작업은 id
필드 값이 ObjectId("57506d62f57802807471dd41")
인 문서를 업데이트합니다.
collection.updateOne( eq("_id", new ObjectId("57506d62f57802807471dd41")), combine(set("stars", 1), set("contact.phone", "228-555-9999"), currentDate("lastModified")) ).subscribe(new ObservableSubscriber<UpdateResult>());
구체적으로 이 작업에서는 다음 메서드를 사용합니다.
Updates.set()
stars
필드의 값을1
(으)로 설정하고contact.phone
필드의 값을"228-555-9999"
으)로 설정합니다.Updates.currentDate()
lastModified
필드를 현재 날짜로 수정합니다.lastModified
필드가 존재하지 않으면 연산자는 해당 필드를 문서에 추가합니다.
여러 문서 업데이트하기
updateMany()
메서드는 필터 조건과 일치하는 모든 문서를 업데이트합니다.
restaurants
컬렉션에 대한 다음 작업은 stars
필드의 값이 2
인 모든 문서를 업데이트합니다.
collection.updateMany( eq("stars", 2), combine(set("stars", 0), currentDate("lastModified")) ).subscribe(new ObservableSubscriber<UpdateResult>());
구체적으로 이 작업에서는 다음 메서드를 사용합니다.
Updates.set()
stars
필드의 값을0
(으)로 설정합니다.Updates.currentDate()
lastModified
필드를 현재 날짜로 설정합니다.lastModified
필드가 존재하지 않으면 연산자는 해당 필드를 문서에 추가합니다.
업데이트 옵션
updateOne()
및 updateMany()
메서드를 사용할 때 UpdateOptions
문서를 포함하여 upsert
옵션 또는 bypassDocumentationValidation
옵션을 지정할 수 있습니다.
collection.updateOne( eq("_id", 1), combine(set("name", "Fresh Breads and Tulips"), currentDate("lastModified")), new UpdateOptions().upsert(true).bypassDocumentValidation(true) ).subscribe(new ObservableSubscriber<UpdateResult>());
기존 문서 교체
컬렉션의 기존 문서를 바꾸려면 컬렉션의 replaceOne()
메서드를 사용할 수 있습니다.
중요
id
필드는 변경할 수 없으므로 문서에서 id
필드를 바꿀 수 없습니다.
필터
필터 문서를 replaceOne()
메서드에 전달하여 교체할 문서를 지정할 수 있습니다. 필터 문서 사양은 읽기 작업과 동일합니다. 필터 객체를 쉽게 만들 수 있도록 드라이버는 Filters
헬퍼 클래스를 제공합니다.
빈 필터를 지정하고 컬렉션의 모든 문서를 일치시키려면 빈 Document
객체를 필터로 사용합니다.
replaceOne()
메서드는 필터 조건이 컬렉션의 여러 문서와 일치하더라도 최대 단일 문서를 대체합니다.
문서 교체하기
문서를 교체하려면 새 문서를 replaceOne()
메서드에 전달합니다.
중요
대체 문서에는 원본 문서와 다른 필드가 있을 수 있습니다. 대체 문서에서 id
필드는 변경되지 않으므로 id
필드를 생략할 수 있습니다. 그러나 id
필드를 포함하는 경우 id
필드에 다른 값을 지정할 수 없습니다.
restaurants
컬렉션에 대한 다음 작업은 id
필드의 값이 ObjectId("57506d62f57802807471dd41")
인 문서를 대체합니다.
collection.replaceOne( eq("_id", new ObjectId("57506d62f57802807471dd41")), new Document("name", "Green Salads Buffet") .append("contact", "TBD") .append("categories", Arrays.asList("Salads", "Health Foods", "Buffet")) ).subscribe(new ObservableSubscriber<UpdateResult>());
업데이트 옵션
replaceOne()
메서드를 사용할 때 UpdateOptions
문서를 포함하여 upsert
옵션 또는 bypassDocumentationValidation
옵션을 지정할 수 있습니다.
collection.replaceOne( eq("name", "Orange Patisserie and Gelateria"), new Document("stars", 5) .append("contact", "TBD") .append("categories", Arrays.asList("Cafe", "Pastries", "Ice Cream")), new UpdateOptions().upsert(true).bypassDocumentValidation(true) ).subscribe(new ObservableSubscriber<UpdateResult>());
문서 삭제
컬렉션의 문서를 삭제하려면 deleteOne()
및 deleteMany()
메서드를 사용할 수 있습니다.
필터
필터 문서를 메서드에 전달하여 삭제할 문서를 지정할 수 있습니다. 필터 문서 사양은 읽기 작업과 동일합니다. 필터 객체를 쉽게 만들 수 있도록 드라이버는 Filters
헬퍼 클래스를 제공합니다.
빈 필터를 지정하고 컬렉션의 모든 문서를 일치시키려면 빈 Document
객체를 필터로 사용합니다.
단일 문서 삭제
deleteOne()
메서드는 필터 조건이 컬렉션의 여러 문서와 일치하더라도 최대 단일 문서를 삭제합니다.
restaurants
컬렉션에 대한 다음 작업은 _id
필드 값이 ObjectId("57506d62f57802807471dd41")
인 문서를 삭제합니다.
collection .deleteOne(eq("_id", new ObjectId("57506d62f57802807471dd41"))) .subscribe(new ObservableSubscriber<DeleteResult>());
여러 문서 삭제
deleteMany()
메서드는 필터 조건과 일치하는 모든 문서를 삭제합니다.
restaurants
컬렉션에 대한 다음 작업은 stars
필드 값이 4
인 모든 문서를 삭제합니다.
collection .deleteMany(eq("stars", 4)) .subscribe(new ObservableSubscriber<DeleteResult>());
쓰기 고려
쓰기 고려는 쓰기 작업에 대해 MongoDB에서 요청하는 승인 수준을 설명합니다.
다음 수준에서 쓰기 고려를 구성할 수 있습니다.
다음과 같은 방법으로
MongoClient
에서:MongoClientSettings
인스턴스를 생성합니다.MongoClient mongoClient = MongoClients.create(MongoClientSettings.builder() .applyConnectionString(new ConnectionString("mongodb://host1,host2")) .writeConcern(WriteConcern.MAJORITY) .build()); ConnectionString
인스턴스를 생성합니다.MongoClient mongoClient = MongoClients.create("mongodb://host1:27017,host2:27017/?w=majority");
withWriteConcern()
메서드를 사용하여MongoDatabase
에서:MongoDatabase database = mongoClient.getDatabase("test").withWriteConcern(WriteConcern.MAJORITY); withWriteConcern()
메서드를 사용하여MongoCollection
에서:MongoCollection<Document> collection = database .getCollection("restaurants") .withWriteConcern(WriteConcern.MAJORITY);
MongoDatabase
MongoCollection
인스턴스는 변경할 수 없습니다. 기존 MongoDatabase
또는 MongoCollection
인스턴스에서 withWriteConcern()
를 호출하면 새 인스턴스가 반환되며 메서드가 호출되는 인스턴스에는 영향을 주지 않습니다.
다음 예제에서 collWithWriteConcern
인스턴스의 쓰기 고려는 majority
인 반면, collection
의 읽기 설정은 영향을 받지 않습니다.
MongoCollection<Document> collWithWriteConcern = collection .withWriteConcern(WriteConcern.MAJORITY);
읽기 고려, 읽기 설정 및 쓰기 고려의 조합을 포함하도록 MongoClientSettings
, MongoDatabase
또는 MongoCollection
인스턴스를 빌드할 수 있습니다.
예를 들어 다음 코드는 컬렉션 수준에서 이 세 가지를 모두 설정합니다.
Collection = database.getCollection("restaurants") .withReadPreference(ReadPreference.primary()) .withReadConcern(ReadConcern.MAJORITY) .withWriteConcern(WriteConcern.MAJORITY);