MongoDB では、データは階層構造で整理されています。 MongoDB 配置には 1 つ以上のデータベースが含まれ、各データベースには 1 つ以上のコレクションが含まれます。 各コレクションでは、MongoDB は、フィールドと値のペアを含むドキュメントとしてデータを保存します。
前提条件
このガイドのコード例を実行するには、プログラムに次のインポート ステートメントを含める必要があります。
import org.mongodb.scala._ import org.mongodb.scala.model.Filters._ 
注意
このガイドでは、 クイック スタート プライマリで説明されている Observableの暗黙的な方法を使用します。
MongoDB 配置への接続
まず、実行中の MongoDB 配置に接続します。
次のコードは、ポート27017のlocalhostで実行されているスタンドアロンの MongoDB 配置に接続します。
val mongoClient = MongoClient() 
MongoDB 配置への接続の詳細については、「 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() 
Capped コレクションの詳細については、サーバー マニュアルの「 Capped コレクション 」を参照してください。
ドキュメントの検証
MongoDB では、アップデートや挿入中にドキュメントを検証できます。 検証ルールは、検証ルールまたは式を指定するフィルタードキュメントを取りますValidationOptionsクラスを使用してコレクション レベルで指定されます。
次の例では、スキーマ検証を使用して コレクションを作成しています。
ValidationOptions collOptions = ValidationOptions().validator(         Filters.or(Filters.exists("email"), Filters.exists("phone"))) database.createCollection("contacts", CreateCollectionOptions().validationOptions(collOptions))         .printResults() 
ドキュメント検証の詳細については、サーバー マニュアルの「スキーマ検証」を参照してください。
コレクションの一覧を取得する
データベース内のコレクションのリストは、 MongoDatabase.listCollectionNames()メソッドを使用して取得できます。
database.listCollectionNames().printResults() 
コレクションの削除
MongoCollection.drop()メソッドを使用して、コレクションを削除し、コレクション内のすべてのデータを削除できます。
val collection: MongoCollection[Document] = database.getCollection("contacts") collection.drop().printResults() 
不変性
MongoDatabase とMongoCollectionインスタンスは不変です。 既存の インスタンスから、読み取り保証( read concern ) 、読み込み設定( read preference )、書込み保証( write concern ) など、異なるプロパティを持つ新しい インスタンスを作成するには、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() 
この方法で使用するには、任意のクラスが満たす必要がある 2 つの要件があります。
Codecクラスの インスタンスは、MongoCollectionのCodecRegistryに登録されている必要があります。Codecインスタンスは、たとえばInt32のような単一の BSON 値だけでなく、完全な BSON ドキュメントをエンコードおよびデコードするインスタンスである必要があります。
デフォルトでは、 MongoCollectionは 4 つのクラスのCodecインスタンスで構成されています。
Document(ScalaBsonDocumentラッパー)BsonDocumentDocument(Java ドライバーの緩やかに型指定されたDocumentクラス)BasicDBObject
アプリケーションはCodecRegistryをカスタマイズすることで、他のクラスのCodec実装を無料で登録できます。 新しいCodecRegistryインスタンスは、次のレベルで構成できます。
MongoClientSettingsMongoClientで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)