データベースとコレクション
MongoDB では、データは階層構造で整理されています。 MongoDB 配置には 1 つ以上のデータベースが含まれ、各データベースには 1 つ以上のコレクションが含まれます。 各コレクションでは、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 配置に接続します。
次のコードは、ポート27017
のlocalhost
で実行されているスタンドアロンの MongoDB 配置に接続します。
MongoClient mongoClient = MongoClients.create();
MongoDB 配置への接続の詳細については、「 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>());
Capped コレクションの詳細については、サーバー マニュアルの「 Capped コレクション 」を参照してください。
ドキュメントの検証
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>());
ドキュメント検証の詳細については、サーバー マニュアルの「スキーマ検証」を参照してください。
コレクションの一覧を取得する
データベース内のコレクションのリストは、 MongoDatabase.listCollectionNames()
メソッドを使用して取得できます。
database.listCollectionNames().subscribe(new PrintToStringSubscriber<String>());
コレクションの削除
MongoCollection.drop()
メソッドを使用して、コレクションを削除し、コレクション内のすべてのデータを削除できます。
MongoCollection<Document> collection = database.getCollection("contacts"); collection.drop().subscribe(new OperationSubscriber<Void>());
不変性
MongoDatabase
とMongoCollection
インスタンスは不変です。 既存の インスタンスから、読み取り保証( read concern ) 、読み込み設定( read preference )、書込み保証( write concern ) など、異なるプロパティを持つ新しい インスタンスを作成するには、MongoDatabase
MongoCollection
クラスと クラスは次のメソッドを提供します。
MongoDatabase.withReadConcern()
MongoDatabase.withReadPreference()
MongoDatabase.withWriteConcern()
MongoCollection.withReadConcern()
MongoCollection.withReadPreference()
MongoCollection.withWriteConcern()
詳しくは、「 MongoDB からのデータの読み取り 」および「 MongoDBへのMongoDBの書き込み」チュートリアルを参照してください。
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());
この方法で使用するには、任意のクラスが満たす必要がある 2 つの要件があります。
Codec
クラスの インスタンスは、MongoCollection
のCodecRegistry
に登録されている必要があります。Codec
インスタンスは、たとえばInt32
のような単一の BSON 値だけでなく、完全な BSON ドキュメントをエンコードおよびデコードするインスタンスである必要があります。
デフォルトでは、 MongoCollection
は 3 つのクラスの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);