読み取り操作
項目一覧
読み取り操作は、コレクションからドキュメントまたはドキュメントに関する情報を取得します。 フィルターを指定して、フィルター条件に一致するドキュメントのみを検索できます。
前提条件
このガイドのコード例を実行するには、次のコンポーネントを設定する必要があります。
のドキュメント 3}Github
test.restaurants
ドキュメントの ファイルのドキュメントが入力されたrestaurants.json
{0 コレクション。次のインポート ステートメントは次のとおりです。
import org.mongodb.scala._ import org.mongodb.scala.model.Filters._ import org.mongodb.scala.model.Projections._ import org.mongodb.scala.model.Sorts._
注意
このガイドでは、 クイック スタート プライマリで説明されているObservable
暗黙を使用します。
MongoDB 配置への接続
まず、MongoDB 配置に接続し、 インスタンスとMongoDatabase
MongoCollection
インスタンスを 宣言して定義します。
次のコードは、ポート27017
のlocalhost
で実行されているスタンドアロンの MongoDB 配置に接続します。 次に、 test
データベースを参照するためのdatabase
変数と、 restaurants
コレクションを参照するためのcollection
変数を定義します。
val mongoClient: MongoClient = MongoClient() val database: MongoDatabase = mongoClient.getDatabase("test") val collection: MongoCollection[Document] = database.getCollection("restaurants")
MongoDB 配置への接続の詳細については、「 MongoDB への接続」チュートリアルを参照してください。
コレクションのクエリ
コレクションをクエリするには、コレクションのfind()
メソッドを使用できます。
引数なしで メソッドを呼び出して、コレクション内のすべてのドキュメントをクエリできます。
collection.find().printResults()
または、フィルターを渡して、フィルター条件に一致するドキュメントをクエリすることもできます。
collection.find(equal("name", "456 Cookies Shop")) .printResults()
クエリフィルター
特定の条件に一致するドキュメントをクエリするには、フィルター ドキュメントをfind()
メソッドに渡します。
空のフィルター
空のフィルターを指定して、コレクション内のすべてのドキュメントを一致させるには、空のDocument
オブジェクトを使用します。
collection.find(Document()).printResults()
Tip
find()
メソッドを使用する場合、コレクション内のすべてのドキュメントに一致するようにフィルター オブジェクトを渡せずに メソッドを呼び出すこともできます。
collection.find().printResults()
フィルター ヘルパー
フィルター ドキュメントの作成を容易にするために、ドライバーはフィルター条件ヘルパー メソッドを提供するFilters
クラスを提供します。 これらの方法の詳細については、フィルターのガイドを参照してください。
この検索操作には、次の条件を指定するフィルターDocument
インスタンスが含まれています。
stars
フィールド値は2
以上で5
未満ですcategories
フィールドは"Bakery"
と等しい、またはcategories
が配列フィールドである場合は、string"Bakery"
が要素として含まれます
collection.find( Document("stars" -> Document("$gte" -> 2, "$lt"-> 5, "categories" -> "Bakery"))) .printResults()
次の例では、 Filters
ヘルパー メソッドを使用して同じフィルター条件を指定しています。
collection.find(and(gte("stars", 2), lt("stars", 5), equal("categories", "Bakery"))) .printResults()
クエリフィルター演算子のリストを表示するには、サーバー マニュアルの「クエリ 演算子とプロジェクション 演算子」を参照してください。 Filters
ヘルパーのリストを表示するには、 フィルター API ドキュメント を参照してください。
FindObservable
find()
メソッドはFindObservable
クラスのインスタンスを返します。 クラスは、 find()
メソッドに連結して、 sort()
やprojection()
などのクエリの出力や動作を変更したり、 subscribe()
メソッドを介して結果を反復処理したりできるさまざまなメソッドを提供します。
プロジェクション
デフォルトでは、MongoDB のクエリは一致するドキュメント内のすべてのフィールドを返します。 一致するドキュメントで返されるフィールドを指定するには、 プロジェクション ドキュメントを指定できます。
この検索操作の例には、一致するドキュメントにname
、 stars
、およびcategories
フィールドのみが含まれることを指定する プロジェクションDocument
が含まれています。
collection.find(and(gte("stars", 2), lt("stars", 5), equal("categories", "Bakery"))) .projection(Document("name" -> 1, "stars" -> 1, "categories" -> 1, "_id" -> 0)) .printResults()
プロジェクション ドキュメントの作成を容易にするために、ドライバーはProjections
クラスのヘルパー メソッドを提供します。 これらのメソッドの詳細については、「プロジェクション」のガイドを参照してください。
collection.find(and(gte("stars", 2), lt("stars", 5), equal("categories", "Bakery"))) .projection(fields(include("name", "stars", "categories"), excludeId())) .printResults()
プロジェクション ドキュメントでは、 プロジェクション演算子を使用してプロジェクション式を指定することもできます。
Projections.metaTextScore()
メソッドを使用する例については、テキスト検索のチュートリアル を参照してください。
ソート
ドキュメントを並べ替えるには、並べ替え仕様ドキュメントをFindObservable.sort()
メソッドに渡します。 このドライバーは、並べ替え仕様ドキュメントの作成を容易にするためのSorts
ヘルパー メソッドを提供します。 ビルダを使用してソート基準を構築する方法については、「ソート」のガイドを参照してください。
collection.find(and(gte("stars", 2), lt("stars", 5), equal("categories", "Bakery"))) .sort(ascending("name")) .printResults()
プロジェクションによるソート
FindObservable
メソッド自体はFindObservable
オブジェクトを返すため、 find()
メソッドに複数のFindObservable
メソッドを追加できます。
collection.find(and(gte("stars", 2), lt("stars", 5), eq("categories", "Bakery"))) .explain() .printResults()
explain
検索操作を説明するには、 FindObservable.explain()
メソッドを呼び出します。
collection.find(and(gte("stars", 2), lt("stars", 5), eq("categories", "Bakery"))) .explain() .printResults()
読み込み設定 (read preference)
レプリカセットまたはシャーディングされたクラスターに対する読み取り操作の場合、次のレベルで読み込み設定(read preference)を構成できます。
次の方法で
MongoClient
で実行されます。MongoClientSettings
インスタンスを作成する方法val mongoClient = MongoClient(MongoClientSettings.builder() .applyConnectionString(ConnectionString("mongodb://host1,host2")) .readPreference(ReadPreference.secondary()) .build()) ConnectionString
インスタンスを作成する方法val mongoClient = MongoClient("mongodb://host1:27017,host2:27017/?readPreference=secondary")
MongoDatabase
でwithReadPreference()
メソッドを使用することで、val database = mongoClient.getDatabase("test") .withReadPreference(ReadPreference.secondary()) MongoCollection
でwithReadPreference()
メソッドを使用することで、val collection = database.getCollection("restaurants") .withReadPreference(ReadPreference.secondary())
MongoDatabase
とMongoCollection
インスタンスは不変です。 既存のMongoDatabase
またはMongoCollection
インスタンスでwithReadPreference()
を呼び出すと、新しい インスタンスが返されますが、メソッドが呼び出されるインスタンスには影響しません。
次の例では、 collectionWithReadPref
インスタンスの読み込み設定(read preference)はprimaryPreferred
ですが、 collection
の読み込み設定(read preference)は影響を受けません。
val collectionWithReadPref = collection.withReadPreference(ReadPreference.primaryPreferred())
読み取り保証(read concern)
レプリカセットまたはシャーディングされたクラスターに対する読み取り操作の場合、アプリケーションは次のレベルで読み取り保証を構成できます。
次の方法で
MongoClient
で実行されます。MongoClientSettings
インスタンスを作成する方法val mongoClient = MongoClient(MongoClientSettings.builder() .applyConnectionString(ConnectionString("mongodb://host1,host2")) .readConcern(ReadConcern.MAJORITY) .build()) ConnectionString
インスタンスを作成する方法val mongoClient = MongoClient("mongodb://host1:27017,host2:27017/?readConcernLevel=majority")
MongoDatabase
でwithReadConcern()
メソッドを使用することで、val database = mongoClient.getDatabase("test") .withReadConcern(ReadConcern.MAJORITY) MongoCollection
でwithReadConcern()
メソッドを使用することで、val collection = database.getCollection("restaurants") .withReadConcern(ReadConcern.MAJORITY)
MongoDatabase
とMongoCollection
インスタンスは不変です。 既存のMongoDatabase
またはMongoCollection
インスタンスでwithReadConcern()
を呼び出すと、新しい インスタンスが返されますが、メソッドが呼び出されるインスタンスには影響しません。
次の例では、 collWithReadConcern
インスタンスにはAVAILABLE
の読み取り保証がありますが、 collection
の読み取り保証には影響がありません。
val collWithReadConcern = collection.withReadConcern(ReadConcern.AVAILABLE)
MongoClientSettings
、 MongoDatabase
、またはMongoCollection
インスタンスをビルドすると、読み取り保証、読み込み設定(read preference)、書込み保証(write concern)の組み合わせを含めることができます。
たとえば、次のコードでは、コレクション レベルで 3 つすべてを設定します。
val collection = database.getCollection("restaurants") .withReadPreference(ReadPreference.primary()) .withReadConcern(ReadConcern.MAJORITY) .withWriteConcern(WriteConcern.MAJORITY)