데이터베이스 및 컬렉션
MongoDB는 데이터를 계층적 구조로 구성합니다. MongoDB 배포에는 하나 이상의 데이터베이스가 포함되며, 각 데이터베이스에는 하나 이상의 컬렉션이 포함됩니다. 각 컬렉션에서 MongoDB는 필드-값 쌍을 포함하는 문서로 데이터를 저장합니다.
전제 조건
이 가이드의 코드 예제를 실행하려면 프로그램에 다음 가져오기 문을 포함해야 합니다.
import com.mongodb.reactivestreams.client.MongoClients; import com.mongodb.reactivestreams.client.MongoClient; import com.mongodb.reactivestreams.client.MongoCollection; import com.mongodb.reactivestreams.client.MongoDatabase; import static com.mongodb.client.model.Filters.*; import com.mongodb.client.model.CreateCollectionOptions; import com.mongodb.client.model.ValidationOptions;
중요
이 가이드 에서는 퀵 스타트 프라이머에 설명된 Subscriber
구현을 사용합니다.
MongoDB 배포에 연결하기
먼저 실행 중인 MongoDB deployment에 연결합니다.
다음 코드는 포트 27017
의 localhost
에서 실행되는 독립형 MongoDB 배포서버에 연결합니다.
MongoClient mongoClient = MongoClients.create();
MongoDB deployment에 연결하는 방법에 대해 자세히 알아보려면 MongoDB에 연결 튜토리얼을 참조하세요.
데이터베이스에 액세스
MongoClient
인스턴스가 MongoDB 배포에 연결되면 `getDatabase()
메서드를 사용하여 데이터베이스에 액세스합니다.
데이터베이스 이름을 getDatabase()
메서드에 매개 변수로 전달합니다. 데이터베이스가 존재하지 않는 경우, 데이터베이스에 데이터를 삽입할 때 MongoDB가 데이터베이스를 생성합니다.
다음 예제에서는 test
데이터베이스에 액세스합니다.
MongoDatabase database = mongoClient.getDatabase("test");
참고
MongoDatabase
인스턴스는 변경되지 않습니다. 자세히 알아보려면 이 가이드의 불변성 섹션을 참조하세요.
컬렉션에 액세스
MongoDatabase
인스턴스를 만든 후 getCollection()
메서드를 사용하여 해당 데이터베이스 내에서 컬렉션에 액세스합니다.
컬렉션 이름을 getCollection()
메서드에 매개변수로 전달합니다.
다음 코드는 이전 섹션에서 만든 database
인스턴스를 사용하여 myTestCollection
컬렉션에 액세스합니다.
MongoCollection<Document> coll = database.getCollection("myTestCollection");
참고
MongoCollection
인스턴스는 변경되지 않습니다. 자세한 내용은 이 가이드의 불변성 섹션을 참조하세요.
해당 이름의 컬렉션이 존재하지 않는 경우 해당 컬렉션에 데이터를 처음 삽입할 때 MongoDB가 컬렉션을 생성합니다.
최대 크기를 설정하거나 문서 유효성 검사 규칙을 만드는 등 다양한 옵션을 사용하여 컬렉션을 직접 만들 수도 있습니다.
컬렉션 생성
드라이버는 컬렉션을 직접 만들 수 있는 createCollection()
메서드를 제공합니다. 컬렉션을 만들 때 CreateCollectionOptions
클래스를 사용하여 최대 크기 또는 문서 유효성 검사 규칙과 같은 다양한 컬렉션 옵션을 지정할 수 있습니다.
옵션을 지정하지 않는 경우, 데이터를 처음 삽입할 때 MongoDB가 자동으로 새 컬렉션을 생성하므로 컬렉션을 직접 만들 필요가 없습니다.
고정 사이즈 컬렉션
다음 작업은 1 메가바이트로 제한된 고정 사이즈 컬렉션을 생성합니다.
database.createCollection( "cappedCollection", new CreateCollectionOptions().capped(true).sizeInBytes(0x100000) ).subscribe(new OperationSubscriber<Void>());
고정 사이즈 컬렉션 에 대해 자세히 알아보려면 MongoDB Server 매뉴얼의 고정 사이즈 컬렉션을 참조하세요.
문서 유효성 검사
MongoDB를 사용하면 업데이트 및 삽입 중에 문서의 유효성을 검사할 수 있습니다. 유효성 검사 규칙은 유효성 검사 규칙 또는 표현식을 지정하는 필터 문서를 사용하는 ValidationOptions
클래스를 사용하여 컬렉션 수준에서 지정됩니다.
다음 예에서는 스키마 유효성 검사를 사용하여 컬렉션을 만듭니다.
ValidationOptions collOptions = new ValidationOptions().validator( Filters.or(Filters.exists("email"), Filters.exists("phone"))); database.createCollection( "contacts", new CreateCollectionOptions().validationOptions(collOptions) ).subscribe(new OperationSubscriber<Void>());
문서 유효성 검사에 대해 자세히 알아보려면 MongoDB Server 매뉴얼의 스키마 유효성 검사 를 참조하세요.
컬렉션 목록 가져오기
MongoDatabase.listCollectionNames()
메서드를 사용하여 데이터베이스의 컬렉션 목록을 가져올 수 있습니다.
database.listCollectionNames().subscribe(new PrintToStringSubscriber<String>());
제거 collection
MongoCollection.drop()
메서드를 사용하여 컬렉션을 삭제하고 컬렉션의 모든 데이터를 삭제할 수 있습니다.
MongoCollection<Document> collection = database.getCollection("contacts"); collection.drop().subscribe(new OperationSubscriber<Void>());
불변성
MongoDatabase
MongoCollection
인스턴스는 변경할 수 없습니다. 읽기 고려, 읽기 설정 및 쓰기 고려 와 같이 서로 다른 속성을 가진 기존 인스턴스에서 새 인스턴스를 생성하기 위해 MongoDatabase
및 MongoCollection
클래스는 다음 메서드를 제공합니다.
MongoDatabase.withReadConcern()
MongoDatabase.withReadPreference()
MongoDatabase.withWriteConcern()
MongoCollection.withReadConcern()
MongoCollection.withReadPreference()
MongoCollection.withWriteConcern()
CodecRegistry
getCollection()
메서드의 오버로드를 사용하면 BSON 문서를 나타내는 다른 클래스를 지정할 수 있습니다. 예를 들어, CRUD 작업을 수행할 때 문서를 모델링하기 위해 엄격하고 형식이 안전한 BsonDocument
클래스를 사용할 수 있습니다.
// pass BsonDocument.class as the second argument MongoCollection<BsonDocument> collection = database .getCollection("mycoll", BsonDocument.class); // insert a document BsonDocument document = BsonDocument.parse("{x: 1}"); collection.insertOne(document).subscribe(new OperationSubscriber<Void>()); document.append("x", new BsonInt32(2)).append("y", new BsonInt32(3)); // replace a document collection.replaceOne(Filters.eq("_id", document.get("_id")), document) .subscribe(new PrintSubscriber<UpdateResult>("Update Result: %s")); // find documents collection.find().subscribe(new PrintDocumentSubscriber());
모든 클래스가 이러한 방식으로 사용하려면 두 가지 요구 사항을 충족해야 합니다.
Codec
클래스의 인스턴스는MongoCollection
의CodecRegistry
에 등록되어야 합니다.Codec
인스턴스는Int32
와 같은 단일 BSON 값뿐만 아니라 전체 BSON 문서를 인코딩 및 디코딩하는 인스턴스여야 합니다.
기본적으로 MongoCollection
는 세 가지 클래스에 대한 Codec
인스턴스로 구성됩니다.
Document
BsonDocument
BasicDBObject
애플리케이션은 CodecRegistry
을(를) 사용자 지정하여 다른 클래스에 대한 Codec
구현을 자유롭게 등록할 수 있습니다. 새 CodecRegistry
인스턴스는 다음 수준에서 구성할 수 있습니다.
MongoClientSettings
MongoClient
에서withCodecRegistry
메서드 내의MongoDatabase
에서withCodecRegistry
메서드 내의MongoCollection
에서
UUID
클래스의 인스턴스를 인코딩 및 디코딩하는 경우를 생각해 보세요. 드라이버는 기본적으로 다른 MongoDB 드라이버와 호환되지 않는 바이트 순서를 사용하여 UUID
인스턴스를 인코딩하며, 기본값을 변경하는 것은 위험할 수 있습니다.
여러 드라이버에 대한 상호 운용성이 필요한 새 애플리케이션은 해당 기본값을 변경할 수 있으며, 다음을 지정하여 이를 수행할 수 있습니다. CodecRegistry
// replaces the default UuidCodec to use the standard UUID representation CodecRegistry codecRegistry = CodecRegistries.fromRegistries( CodecRegistries.fromCodecs(new UuidCodec(UuidRepresentation.STANDARD) ), MongoClientSettings.getDefaultCodecRegistry()); // globally MongoClientSettings settings = MongoClientSettings.builder() .codecRegistry(codecRegistry).build(); MongoClient client = MongoClients.create(settings); // or per database MongoDatabase database = client.getDatabase("mydb") .withCodecRegistry(codecRegistry); // or per collection MongoCollection<Document> collection = database.getCollection("mycoll") .withCodecRegistry(codecRegistry);