クイック スタート
項目一覧
- Overview
- 前提条件
- 接続を行う
- 単一の MongoDB 配置への接続
- データベースへのアクセス
- コレクションにアクセスする
- ドキュメントの作成
- ドキュメントの挿入
- 1つのドキュメントの挿入
- 複数のドキュメントの挿入
- コレクション内のドキュメントをカウント
- コレクションをクエリする
- コレクション内の最初のドキュメントの検索
- コレクション内の全ドキュメントの検索
- クエリフィルターの指定
- フィルターに一致する単一ドキュメントを取得する
- フィルターに一致するすべてのドキュメントを取得する
- Update Documents
- 単一ドキュメントの更新
- 複数のドキュメントの更新
- Delete Documents
- フィルターに一致する単一ドキュメントの削除
- フィルターに一致するすべてのドキュメントの削除
- インデックスの作成
- 詳細情報
Overview
このガイドのコード例は、ドライバーソースコードGitHubリポジトリの QuickTour.scala ファイルから取得されています。
注意
Scala ドライバーをインストールする方法について詳しくは、「 インストールガイド 」を参照してください。
注意
このガイドでは、クイック スタート プライマリで説明されている Observable
の暗黙的な方法を使用します。
前提条件
このガイドのコード例を実行するには、次のコンポーネントを設定する必要があります。
MongoDB のデフォルトポートで実行されている MongoDB サーバー(
27017
)プロジェクトにインストールされたドライバーの依存関係
次のインポート ステートメントは次のとおりです。
import org.mongodb.scala._ import org.mongodb.scala.model.Aggregates._ import org.mongodb.scala.model.Filters._ import org.mongodb.scala.model.Projections._ import org.mongodb.scala.model.Sorts._ import org.mongodb.scala.model.Updates._ import org.mongodb.scala.model._ import scala.collection.JavaConverters._
接続を行う
MongoClient の使用 実行中の MongoDB 配置に接続するためのコンフィギュレーション オブジェクト。
MongoClient
インスタンスは、データベースへの接続のプールを表します。 同時操作スレッドを使用する場合でも、必要なインスタンスはMongoClient
の 1 つだけです。
重要
通常、スタンドアロン配置、レプリカセット、シャーディングされたクラスターなどの特定の MongoDB 配置に対してMongoClient
インスタンスを 1 つだけ作成し、アプリケーション全体でクライアントを使用します。 ただし、 インスタンスを複数作成する場合は、次の点に注意してください。
すべてのリソース使用量の制限(最大接続数など)は各
MongoClient
インスタンスに適用されます。インスタンスを破棄するには、
MongoClient.close()
メソッドを呼び出してリソースをクリーンアップします。
単一の MongoDB 配置への接続
次の例は、MongoDB の単一配置に接続する方法をいくつか示しています。
次の方法で、単一の MongoDB 配置に接続できます。
ポート
27017
の localhost で実行されている MongoDB サーバーに接続するために、 パラメータなしでMongoClient
オブジェクトをインスタンス化します。val mongoClient: MongoClient = MongoClient() ポート
27017
の指定されたホストで実行されている MongoDB インスタンスに接続するには、hostname
を明示的に指定します。val mongoClient: MongoClient = MongoClient( MongoClientSettings.builder() .applyToClusterSettings((builder: ClusterSettings.Builder) => builder.hosts(List(new ServerAddress("hostOne")).asJava)) .build()) hostname
とport
を明示的に指定します。val mongoClient: MongoClient = MongoClient( MongoClientSettings.builder() .applyToClusterSettings((builder: ClusterSettings.Builder) => builder.hosts(List(new ServerAddress("hostOne", 27017)).asJava)) .build()) ConnectionString
を指定します。val mongoClient: MongoClient = MongoClient("mongodb://hostOne:27017")
データベースへのアクセス
MongoClient
インスタンスがMongoDB 配置に接続されたら、MongoClient.getDatabase()
メソッドを使用してデータベースにアクセスします。
getDatabase()
メソッドにデータベースの名前を指定します。 データベースが存在しない場合は、そのデータベースのデータを最初に保存するときに MongoDB によってデータベースが作成されます。
次の例では、 mydb
データベースにアクセスします。
val database: MongoDatabase = mongoClient.getDatabase("mydb")
MongoDatabase
インスタンスは不変です。
コレクションにアクセスする
MongoDatabase
インスタンスが作成されたら、 getCollection()
メソッドを使用してコレクションにアクセスします。
getCollection()
メソッドにコレクションの名前を指定します。 コレクションが存在しない場合、MongoDB は最初にそのコレクションにデータを保存する際にコレクションを作成します。
たとえば、次のステートメントは、 データベース インスタンスを使用して、 mydb
データベース内のtest
という名前のコレクションにアクセスします。
val collection: MongoCollection[Document] = database.getCollection("test")
MongoCollection
インスタンスは不変です。
ドキュメントの作成
ドライバーを使用して ドキュメント を作成するには、次のドキュメントを使用します: クラス。
たとえば、次の JSON ドキュメントについて考えてみます。
{ "name" : "MongoDB", "type" : "database", "count" : 1, "info" : { x : 203, y : 102 } }
ドライバーを使用してドキュメントを作成するには、 Document
オブジェクトをインスタンス化します。
val doc: Document = Document("_id" -> 0, "name" -> "MongoDB", "type" -> "database", "count" -> 1, "info" -> Document("x" -> 203, "y" -> 102))
ドキュメントの挿入
MongoCollection
オブジェクトを取得したら、コレクションにドキュメントを挿入できます。
1つのドキュメントの挿入
コレクションにドキュメントを挿入するには、 insertOne()
メソッドを使用します。 次に、 results()
暗黙ヘルパーを使用して、オブジェクトが完了するまでブロックします。
collection.insertOne(doc).results()
警告
このドライバーは、不変のDocument
と可変のDocument
の 2 つのドキュメントタイプを提供します。
不変ドキュメントを使用している際に、将来の_id
値を確認する必要がある場合は、 _id
値を明示的に追加する必要があります。
ドキュメントに最上位の_id
フィールドが指定されていない場合、MongoDB は自動的に値を生成し、挿入されたドキュメントにこのフィールドを追加しますが、その_id
はユーザーに返されません。
重要
API では、 Observable
インスタンスを返すすべてのメソッドはコールド ストリームです。つまり、サブスクライブされるまで何も発生しません。
たとえば、以下の例では何も行われません。
val observable: Observable[InsertOneResult] = collection.insertOne(doc)
この操作は、 Observable
がサブスクライブし、データがリクエストされた場合にのみ発生します。
observable.subscribe(new Observer[InsertOneResult] { override def onSubscribe(subscription: Subscription): Unit = subscription.request(1) override def onNext(result: InsertOneResult): Unit = println(s"onNext $result") override def onError(e: Throwable): Unit = println("Failed") override def onComplete(): Unit = println("Completed") })
ドキュメントが挿入されると、 onNext()
メソッドが呼び出され、 onNext
とそれに続く結果が出力されます。 最後に、 onComplete()
メソッドはCompleted
を出力します。 何らかの理由でエラーが発生した場合、 onError()
メソッドはFailed
を出力します。
複数のドキュメントの挿入
複数のドキュメントを挿入するには、挿入するドキュメントのリストを受け取るコレクションのinsertMany()
メソッドを使用できます。
次の例では、次の形式で複数のドキュメントを追加しています。
{ "i" : value }
ループ内でドキュメントを作成し、 documents
リストに追加します。
val documents = (1 to 100) map { i: Int => Document("i" -> i) }
これらのドキュメントをコレクションに挿入するには、ドキュメントのリストをinsertMany()
メソッドに渡します。
val insertObservable = collection.insertMany(documents)
上記の例では、 Observable
で をブロックして終了します。 これにより、次の操作が実行される前にデータがデータベースに存在するようになります。
コレクション内のドキュメントをカウント
コレクション内のドキュメント数をカウントするには、コレクションのcount()
メソッドを使用できます。 次のコードでは101
が出力され、 insertMany()
を使用して挿入された100とinsertOne()
を使用して挿入された1が記述されます。
for
理解を使用して、2 つの操作をまとめます。 次のコードは、ドキュメントを挿入し、ドキュメントの数をカウントして、結果を出力します。
val insertAndCount = for { insertResult <- insertObservable countResult <- collection.countDocuments() } yield countResult println(s"Total # of documents: ${insertAndCount.headResult()}")
コレクションをクエリする
コレクションをクエリするには、コレクションのfind()
メソッドを使用できます。 引数なしで メソッドを呼び出して、コレクション内のすべてのドキュメントをクエリしたり、フィルターを渡してフィルター条件に一致するドキュメントをクエリしたりできます。
コレクション内の最初のドキュメントの検索
コレクションの最初のドキュメントを返すには、パラメータなしでfind()
メソッドを使用し、 first()
メソッドをチェーンします。
Tip
find().first()
構造は、1 つのドキュメントのみに一致する必要があるクエリや、最初に一致するドキュメントのみを検討する場合に便利です。
次の例では、 コレクションで最初に見つかったドキュメントを出力します。
collection.find().first().printHeadResult()
この例では、次のドキュメントが出力されます。
{ "_id" : { "$oid" : "551582c558c7b4fbacf16735" }, "name" : "MongoDB", "type" : "database", "count" : 1, "info" : { "x" : 203, "y" : 102 } }
注意
_id
要素は MongoDB によってドキュメントに自動的に追加され、値は表示されている値とは異なります。 MongoDB は、内部使用のために_
と$
で始まるフィールド名を予約します。
コレクション内の全ドキュメントの検索
コレクション内のすべてのドキュメントを取得するには、 find()
メソッドを使用します。 find()
メソッドは、検索操作を連鎖または制御するためのスムーズなインターフェースを提供するFindObservable
インスタンスを返します。 次のコードは、 コレクション内のすべてのドキュメントを検索して出力します。
collection.find().printResults()
クエリフィルターの指定
特定の条件に一致するドキュメントをクエリするには、フィルター オブジェクトをfind()
メソッドに渡します。 フィルター オブジェクトの作成を容易にするために、ドライバーはFilters
ヘルパー メソッドを提供します。
フィルターに一致する単一ドキュメントを取得する
フィールドi
の値が71
である最初のドキュメントを検索するには、 eq()
フィルター定義を渡して等価条件を指定します。
collection.find(equal("i", 71)).first().printHeadResult()
この例では 1 つのドキュメントが出力されます。
{ "_id" : { "$oid" : "..." }, "i" : 71 }
フィルターに一致するすべてのドキュメントを取得する
次の例では、 i
の値が50
より大きいすべてのドキュメントを返して出力します。
collection.find(gt("i", 50)).printResults()
50 < i <= 100
などの範囲のフィルターを指定するには、 and()
ヘルパーを使用できます。
collection.find(and(gt("i", 50), lte("i", 100))).printResults()
Update Documents
コレクション内のドキュメントを更新するには、コレクションのupdateOne()
メソッドとupdateMany()
メソッドを使用できます。
次のパラメーターをメソッドに渡します。
更新するドキュメントを決定するためのフィルター オブジェクト。 フィルター オブジェクトの作成を容易にするために、ドライバーは
Filters
ヘルパー メソッドを提供します。 空のフィルターを指定してコレクション内のすべてのドキュメントを一致させるには、空のDocument
オブジェクトを使用します。変更を指定するドキュメントを更新します。 使用可能な演算子のリストを表示するには、サーバー マニュアルの「更新演算子 」を参照してください。
更新メソッドは、更新によって変更されたドキュメントの数など、操作に関する情報を提供するUpdateResult
タイプを返します。
単一ドキュメントの更新
単一のドキュメントを更新するには、 updateOne()
メソッドを使用します。
次の例では、 i
が10
である最初のドキュメントを更新し、 i
の値を110
に設定します。
collection.updateOne(equal("i", 10), set("i", 110)).printHeadResult("Update Result: ")
複数のドキュメントの更新
クエリフィルターに一致するすべてのドキュメントを更新するには、 updateMany()
メソッドを使用します。
次の例では、i
100
の値がi
より小さいすべてのドキュメントで、 の値を100
ずつ増加させます。
collection.updateMany(lt("i", 100), inc("i", 100)).printHeadResult("Update Result: ")
Delete Documents
コレクションからドキュメントを削除するには、コレクションのdeleteOne()
メソッドとdeleteMany()
メソッドを使用できます。
フィルター オブジェクトを渡して、削除するドキュメントを決定します。 フィルター オブジェクトの作成を容易にするために、ドライバーはFilters
ヘルパー メソッドを提供します。 空のフィルターを指定してコレクション内のすべてのドキュメントを一致させるには、空のDocument
オブジェクトを使用します。
削除メソッドでは、削除されたドキュメント数など操作に関する情報を提供するDeleteResult
が返されます。
フィルターに一致する単一ドキュメントの削除
フィルターに一致するドキュメントを 1 つ削除するには、 deleteOne()
メソッドを使用します。
次の例では、 の値がi
と等しい 最初の110
ドキュメントを削除しています。
collection.deleteOne(equal("i", 110)).printHeadResult("Delete Result: ")
フィルターに一致するすべてのドキュメントの削除
フィルターに一致するすべてのドキュメントを削除するには、 deleteMany()
メソッドを使用します。
次の例では、 の値がi
100
以上であるすべてのドキュメントを削除しています。
collection.deleteMany(gte("i", 100)).printHeadResult("Delete Result: ")
インデックスの作成
1 つまたは複数のフィールドにインデックスを作成するには、インデックス仕様ドキュメントをcreateIndex()
メソッドに渡します。 インデックスキー仕様ドキュメントには、次のドキュメントをモデル化した各フィールドのインデックスとインデックスのタイプが含まれています。
Document(<field1> -> <type1>, <field2>, <type2>, ...)
昇順のインデックス タイプを作成するには、 <type>
の1
を指定します。 降順のインデックス タイプを作成するには、 <type>
の-1
を指定します。
次の例では、 i
フィールドに昇順のインデックスを作成しています。
collection.createIndex(Document("i" -> 1)).printHeadResult("Create Index Result: %s")
他のインデックス タイプのリストを表示するには、「インデックスの作成」ガイドを参照してください。
詳細情報
「クイック スタート(大文字と小文字の例) 」ガイドでは、大文字と小文字 クラスでドライバーを使用する方法が示されています。
「チュートリアル」セクションで、追加のチュートリアルを見つけることができます。