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