Docs Menu
Docs Home
/ / /
Scala
/

データベースとコレクション

項目一覧

  • 前提条件
  • MongoDB 配置への接続
  • データベースへのアクセス
  • コレクションにアクセスする
  • コレクションを作成する
  • コレクションの一覧を取得する
  • コレクションの削除
  • 不変性
  • CodecRegistry

MongoDB では、データは階層構造で整理されています。 MongoDB 配置には 1 つ以上のデータベースが含まれ、各データベースには 1 つ以上のコレクションが含まれます。 各コレクションでは、MongoDB は、フィールドと値のペアを含むドキュメントとしてデータを保存します。

このガイドのコード例を実行するには、プログラムに次のインポート ステートメントを含める必要があります。

import org.mongodb.scala._
import org.mongodb.scala.model.Filters._

注意

このガイドでは、 クイック スタート プライマリで説明されている Observableの暗黙的な方法を使用します。

まず、実行中の MongoDB 配置に接続します。

次のコードは、ポート27017localhostで実行されているスタンドアロンの 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()

MongoDatabaseMongoCollectionインスタンスは不変です。 既存の インスタンスから、読み取り保証( read concern 、読み込み設定( read preference )、書込み保証( write concern ) など、異なるプロパティを持つ新しい インスタンスを作成するには、MongoDatabase MongoCollectionクラスと クラスは次のメソッドを提供します。

  • MongoDatabase.withReadConcern()

  • MongoDatabase.withReadPreference()

  • MongoDatabase.withWriteConcern()

  • MongoCollection.withReadConcern()

  • MongoCollection.withReadPreference()

  • MongoCollection.withWriteConcern()

詳しくは、「読み取り操作書込み操作 」のチュートリアルを参照してください。

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 クラスの インスタンスは、 MongoCollectionCodecRegistryに登録されている必要があります。

  • Codec インスタンスは、たとえばInt32のような単一の BSON 値だけでなく、完全な BSON ドキュメントをエンコードおよびデコードするインスタンスである必要があります。

デフォルトでは、 MongoCollectionは 4 つのクラスのCodecインスタンスで構成されています。

  • Document (Scala 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)

戻る

圧縮