문서 메뉴
문서 홈
/ / /
Java Reactive Streams 드라이버
/

빠른 시작

이 페이지의 내용

  • 전제 조건
  • 연결하기
  • 단일 MongoDB 배포에 연결
  • 데이터베이스에 액세스
  • 컬렉션에 액세스
  • 문서 만들기
  • 문서 삽입
  • 문서 하나 삽입
  • 여러 문서를 삽입합니다.
  • collection의 문서 수 계산
  • 컬렉션 쿼리하기
  • 컬렉션에서 첫 번째 문서 찾기
  • 컬렉션의 모든 문서 찾기
  • 쿼리 필터 지정
  • 필터와 일치하는 단일 문서 가져오기
  • 필터와 일치하는 모든 문서 가져오기
  • 문서 업데이트
  • 단일 문서 업데이트
  • 여러 문서 업데이트하기
  • 문서 삭제
  • 필터와 일치하는 단일 문서 삭제
  • 필터와 일치하는 모든 문서 삭제
  • 인덱스 만들기
  • 추가 정보

이 가이드의 코드 예제는 QuickTour.java 파일을 드라이버 소스 코드 GitHub 리포지토리에 저장합니다.

참고

Java Reactive Streams 드라이버를 설치하는 방법에 대한 지침은 설치 가이드를 참조하세요.

중요

이 가이드에서는 빠른 시작 입문서에 설명된 Subscriber 구현을 사용합니다.

이 가이드의 코드 예제를 실행하려면 다음 구성 요소를 설정해야 합니다.

  • MongoDB의 기본 포트에서 실행되는 MongoDB 서버(27017)

  • 프로젝트에 설치된 드라이버 종속성

  • 다음 가져오기 문:

    import com.mongodb.bulk.BulkWriteResult;
    import com.mongodb.client.model.BulkWriteOptions;
    import com.mongodb.client.model.DeleteOneModel;
    import com.mongodb.client.model.InsertOneModel;
    import com.mongodb.client.model.ReplaceOneModel;
    import com.mongodb.client.model.UpdateOneModel;
    import com.mongodb.client.model.WriteModel;
    import com.mongodb.client.result.InsertOneResult;
    import com.mongodb.client.result.InsertManyResult;
    import com.mongodb.client.result.DeleteResult;
    import com.mongodb.client.result.UpdateResult;
    import com.mongodb.reactivestreams.client.MongoClient;
    import com.mongodb.reactivestreams.client.MongoClients;
    import com.mongodb.reactivestreams.client.MongoCollection;
    import com.mongodb.reactivestreams.client.MongoDatabase;
    import org.bson.Document;
    import java.util.ArrayList;
    import java.util.List;
    import static com.mongodb.client.model.Accumulators.*;
    import static com.mongodb.client.model.Aggregates.*;
    import static com.mongodb.client.model.Filters.*;
    import static com.mongodb.client.model.Projections.*;
    import static com.mongodb.client.model.Sorts.*;
    import static com.mongodb.client.model.Updates.*;
    import static java.util.Arrays.asList;
    import static java.util.Collections.singletonList;

MongoClients.create() 메서드를 사용하여 실행 중인 MongoDB deployment에 연결합니다.

MongoClient 인스턴스는 데이터베이스에 대한 연결 풀을 나타냅니다. 동시 작업 스레드를 사용하는 경우에도 MongoClient 인스턴스가 하나만 필요합니다.

중요

일반적으로 독립형 배포, 복제본 세트 또는 샤드 클러스터와 같은 특정 MongoDB 배포에 대해 MongoClient 인스턴스를 하나만 만들고 애플리케이션 전체에서 클라이언트를 사용합니다. 그러나 여러 인스턴스를 만드는 경우 다음 사항에 유의하세요.

  • 모든 리소스 사용량 제한(예: 최대 연결 수)은 각 MongoClient 인스턴스에 적용됩니다.

  • 인스턴스를 삭제하려면 MongoClient.close() 메서드를 호출하여 리소스를 정리합니다.

다음 예제는 단일 MongoDB deployment에 연결하는 여러 가지 방법을 보여줍니다.

다음과 같은 방법으로 단일 MongoDB deployment에 연결할 수 있습니다.

  • 매개 변수 없이 MongoClient 객체를 인스턴스화하여 포트 27017 의 로컬 호스트에서 실행 중인 MongoDB 서버에 연결합니다.

    MongoClient mongoClient = MongoClients.create();
  • 포트 27017 의 지정된 호스트에서 실행 중인 MongoDB 인스턴스에 연결하려면 hostname 를 명시적으로 지정합니다.

    MongoClient mongoClient = MongoClients.create(
    MongoClientSettings.builder()
    .applyToClusterSettings(builder ->
    builder.hosts(Arrays.asList(new ServerAddress("hostOne"))))
    .build());
  • hostnameport 을 명시적으로 지정합니다.

    MongoClient mongoClient = MongoClients.create(
    MongoClientSettings.builder()
    .applyToClusterSettings(builder ->
    builder.hosts(Arrays.asList(new ServerAddress("hostOne", 27018))))
    .build());
  • ConnectionString 을(를) 지정합니다.

    MongoClient mongoClient = MongoClients.create("mongodb://hostOne:27017");

MongoClient 인스턴스가 MongoDB 배포에 연결되면 MongoClient.getDatabase() 메서드를 사용하여 데이터베이스에 액세스합니다.

getDatabase() 메서드에 데이터베이스 이름을 지정합니다. 데이터베이스가 존재하지 않는 경우, 해당 데이터베이스에 대한 데이터를 처음 저장할 때 MongoDB가 데이터베이스를 생성합니다.

다음 예제에서는 mydb 데이터베이스에 액세스합니다.

MongoDatabase database = mongoClient.getDatabase("mydb");

MongoDatabase 인스턴스는 변경되지 않습니다.

MongoDatabase 인스턴스가 있으면 getCollection()` 메서드를 사용하여 collection에 액세스합니다.

getCollection() 메서드에 컬렉션 이름을 지정합니다. 컬렉션이 존재하지 않는 경우, 해당 컬렉션에 대한 데이터를 처음 저장할 때 MongoDB가 컬렉션을 생성합니다.

예를 들어, 데이터베이스 인스턴스를 사용하여 다음 문은 데이터베이스의 collection에 test mydb 액세스합니다.

MongoCollection<Document> collection = database.getCollection("test");

MongoCollection 인스턴스는 변경되지 않습니다.

드라이버를 사용하여 문서를 만들려면 Document 클래스를 사용합니다.

예를 들어 다음 JSON document 를 가정해 보겠습니다.

{
"name" : "MongoDB",
"type" : "database",
"count" : 1,
"versions": [ "v3.2", "v3.0", "v2.6" ],
"info" : { x : 203, y : 102 }
}

드라이버를 사용하여 문서를 만들려면 필드와 값이 있는 Document 객체를 인스턴스화하고 해당 append() 메서드를 사용하여 문서 객체에 추가 필드와 값을 포함합니다. 이 값은 내장된 문서를 지정하는 또 다른 Document 객체일 수 있습니다.

Document doc = new Document("name", "MongoDB")
.append("type", "database")
.append("count", 1)
.append("versions", Arrays.asList("v3.2", "v3.0", "v2.6"))
.append("info", new Document("x", 203).append("y", 102));

참고

배열의 BSON 유형은 Java 유형 java.util.List 에 해당합니다. BSON types 목록과 Java의 해당 유형은 Document 매핑을 참조하세요.

MongoCollection 객체가 있으면 collection에 문서를 삽입할 수 있습니다.

단일 문서를 collection에 삽입하려면 insertOne() 메서드를 사용할 수 있습니다.

var subscriber = new OperationSubscriber<InsertOneResult>();
collection.insertOne(doc).subscribe(subscriber);
// Wait for the insertOne operation to complete
subscriber.await();

참고

문서에 최상위 _id 필드가 지정되지 않은 경우 MongoDB는 자동으로 값을 생성하고 이 필드를 삽입된 문서에 추가합니다.

중요

API에서 Publisher 인스턴스를 반환하는 모든 메서드는 콜드 스트림이므로 구독할 때까지 아무 일도 일어나지 않습니다.

예를 들어 아래 예제에서는 아무 작업도 수행하지 않습니다.

Publisher<InsertOneResult> publisher = collection.insertOne(doc);

이 작업은 Publisher 이(가) 구독되고 데이터가 요청된 경우에만 발생합니다.

publisher.subscribe(new Subscriber<InsertOneResult>() {
@Override
public void onSubscribe(final Subscription s) {
s.request(1); // <--- Data requested and the insertion will now occur
}
@Override
public void onNext(final InsertOneResult result) {
System.out.println("Inserted: " + result);
}
@Override
public void onError(final Throwable t) {
System.out.println("Failed");
}
@Override
public void onComplete() {
System.out.println("Completed");
}
});

문서가 삽입되면 onNext() 메서드가 호출되고 Inserted: 과 그 결과가 차례로 출력됩니다. 마지막으로 onComplete() 메서드는 Completed 을 출력합니다. 어떤 이유로든 오류가 발생한 경우 onError() 메서드는 Failed 를 출력합니다.

여러 문서를 삽입하려면 삽입할 문서 목록을 사용하는 collection의 insertMany() 메서드를 사용할 수 있습니다.

다음 예에서는 다음 형식으로 여러 문서를 추가합니다.

{ "i" : value }

루프에서 문서를 만들어 documents 목록에 추가합니다.

List<Document> documents = new ArrayList<Document>();
for (int i = 0; i < 100; i++) {
documents.add(new Document("i", i));
}

이러한 문서를 컬렉션에 삽입하려면 문서 목록을 insertMany() 메서드에 전달합니다.

var subscriber = new OperationSubscriber<InsertManyResult>();
collection.insertMany(documents).subscribe(subscriber);
// Wait for the insertMany operation to complete
subscriber.await();

이전 예제에서는 Publisher 에 대한 차단을 완료했습니다. 이렇게 하면 다음 작업이 실행되기 전에 데이터가 데이터베이스에 저장됩니다.

collection의 문서 수를 계산하려면 collection의 countDocuments() 메서드를 사용하면 됩니다. 다음 코드는 insertMany() 을 사용하여 100 삽입된 문서와 insertOne() 를 사용하여 삽입한 1 문서를 설명하는 101 를 출력해야 합니다.

collection.count()
.subscribe(new PrintSubscriber<Long>("total # of documents: %s"));

collection을 쿼리하려면 collection의 find() 메서드를 사용할 수 있습니다. 인수 없이 메서드를 호출하여 collection의 모든 문서를 쿼리하거나 필터를 전달하여 필터 기준과 일치하는 문서를 쿼리할 수 있습니다.

컬렉션의 첫 번째 문서를 반환하려면 매개변수 없이 find() 메서드를 사용하고 first() 메서드를 연결합니다.

find().first() 구문은 단일 문서만 일치해야 하는 쿼리 또는 첫 번째 일치하는 문서에만 관심이 있는 경우에 유용합니다.

다음 예에서는 컬렉션에서 발견된 첫 번째 문서를 인쇄합니다.

collection.find().first().subscribe(new PrintDocumentSubscriber());

이 예제에서는 다음 문서가 출력되어야 합니다.

{
"_id" : { "$oid" : "551582c558c7b4fbacf16735" },
"name" : "MongoDB",
"type" : "database",
"count" : 1,
"info" : { "x" : 203, "y" : 102 }
}

참고

_id 요소는 MongoDB에 의해 문서에 자동으로 추가되었으며 사용자의 값은 표시된 것과 다를 수 있습니다. MongoDB는 _$ 로 시작하는 필드 이름을 내부용으로 사용합니다.

컬렉션의 모든 문서를 검색하려면 find() 메서드를 사용합니다. find() 메서드는 찾기 작업을 연결하거나 제어하기 위한 유창한 인터페이스를 제공하는 FindPublisher 인스턴스를 반환합니다. 다음 코드는 컬렉션의 모든 문서를 검색하고 인쇄합니다.

collection.find().subscribe(new PrintDocumentSubscriber());

특정 조건과 일치하는 문서를 쿼리하려면 필터 객체를 find() 메서드에 전달합니다. 필터 객체를 쉽게 만들 수 있도록 드라이버는 Filters 헬퍼 메서드를 제공합니다.

i 필드에 71 값이 있는 첫 번째 문서를 찾으려면 eq() 필터 정의를 전달하여 동등 조건을 지정합니다.

collection.find(eq("i", 71)).first().subscribe(new PrintDocumentSubscriber());

이 예제에서는 하나의 문서를 인쇄합니다:

{ "_id" : { "$oid" : "5515836e58c7b4fbc756320b" }, "i" : 71 }

다음 예에서는 i 값이 50 보다 큰 모든 문서를 반환하고 인쇄합니다.

collection.find(gt("i", 50)).subscribe(new PrintDocumentSubscriber());

범위에 대한 필터(예: 50 < i <= 100)를 지정하려면 and() 헬퍼를 사용할 수 있습니다.

collection.find(and(gt("i", 50), lte("i", 100)))
.subscribe(new PrintDocumentSubscriber());

컬렉션의 문서를 업데이트하려면 컬렉션의 updateOne()updateMany() 메서드를 사용할 수 있습니다.

메서드에 다음 매개변수를 전달합니다.

  • 업데이트할 문서를 결정하기 위해 객체를 필터링합니다. 필터 객체를 쉽게 만들 수 있도록 드라이버는 Filters 헬퍼 메서드를 제공합니다. 빈 필터를 지정하고 collection의 모든 문서를 일치시키려면 빈 Document 객체를 사용합니다.

  • 수정 사항을 지정하는 문서를 업데이트합니다. 사용 가능한 연산자 목록을 보려면 MongoDB Server 매뉴얼에서 업데이트 연산자 를 참조하세요.

업데이트 메서드는 업데이트로 수정된 문서 수를 포함하여 작업에 대한 정보를 제공하는 UpdateResult 유형을 반환합니다.

단일 문서를 업데이트하려면 updateOne() 메서드를 사용합니다.

다음 예에서는 i10 인 첫 번째 문서를 업데이트하고 i 값을 110 로 설정합니다.

collection.updateOne(eq("i", 10), set("i", 110))
.subscribe(new PrintSubscriber<UpdateResult>("Update Result: %s"));

쿼리 필터와 일치하는 모든 문서를 업데이트하려면 updateMany() 메서드를 사용합니다.

다음 예에서는 i 100 값이 i 미만인 모든 문서에서 값을 만큼 100 증가시킵니다.

UpdateResult updateResult = collection.updateMany(lt("i", 100), inc("i", 100))
.subscribe(new PrintSubscriber<UpdateResult>("Update Result: %s"));

collection에서 문서를 삭제하려면 collection의 deleteOne()deleteMany() 메서드를 사용할 수 있습니다.

필터 객체를 전달하여 삭제할 문서를 결정합니다. 필터 객체를 쉽게 만들 수 있도록 드라이버는 Filters 헬퍼 메서드를 제공합니다. 빈 필터를 지정하고 collection의 모든 문서를 일치시키려면 빈 Document 객체를 사용합니다.

삭제 메서드는 삭제된 문서 수를 포함하여 작업에 대한 정보를 제공하는 DeleteResult 을 반환합니다.

필터와 일치하는 단일 문서를 삭제하려면 deleteOne() 메서드를 사용합니다.

다음 예에서는 i 값이 110 인 첫 번째 문서를 삭제합니다.

collection.deleteOne(eq("i", 110))
.subscribe(new PrintSubscriber<DeleteResult>("Delete Result: %s"));

필터와 일치하는 모든 문서를 삭제하려면 deleteMany() 메서드를 사용합니다.

다음 예에서는 i 값이 100 보다 크거나 같은 모든 문서를 삭제합니다.

DeleteResult deleteResult = collection.deleteMany(gte("i", 100))
.subscribe(new PrintSubscriber<DeleteResult>("Delete Result: %s"));

필드에 인덱스를 만들려면 인덱스 사양 문서를 createIndex() 메서드에 전달합니다. 인덱스 키 사양 문서에는 다음 문서를 모델로 한 인덱싱할 필드와 각 필드의 인덱스 유형이 포함되어 있습니다.

new Document(<field1>, <type1>).append(<field2>, <type2>) ...

오름차순 인덱스 유형을 생성하려면 <type>1 을 지정합니다. 내림차순 인덱스 유형을 생성하려면 <type>-1 를 지정합니다.

다음 예에서는 i 필드에 오름차순 인덱스를 생성합니다.

collection.createIndex(new Document("i", 1))
.subscribe(new PrintSubscriber<String>("Create Index Result: %s"));

다른 인덱스 유형 목록을 보려면 인덱스 생성 가이드를 참조하세요.

POJO와 함께 MongoDB를 사용하는 방법을 보여주는 추가 튜토리얼은 빠른 시작(POJO 예제) 가이드를 참조하세요.

추가 튜토리얼을 찾으려면 튜토리얼 섹션을 참조하세요.

돌아가기

프라이머

다음

빠른 시작(POJO 예제)