Docs Menu
Docs Home
/ / /
Scala
/

クイック スタート

項目一覧

  • Overview
  • 前提条件
  • 接続を行う
  • 単一の MongoDB 配置への接続
  • データベースへのアクセス
  • コレクションにアクセスする
  • ドキュメントの作成
  • ドキュメントの挿入
  • 1つのドキュメントの挿入
  • 複数のドキュメントの挿入
  • コレクション内のドキュメントをカウント
  • コレクションをクエリする
  • コレクション内の最初のドキュメントの検索
  • コレクション内の全ドキュメントの検索
  • クエリフィルターの指定
  • フィルターに一致する単一ドキュメントを取得する
  • フィルターに一致するすべてのドキュメントを取得する
  • Update Documents
  • 単一ドキュメントの更新
  • 複数のドキュメントの更新
  • Delete Documents
  • フィルターに一致する単一ドキュメントの削除
  • フィルターに一致するすべてのドキュメントの削除
  • インデックスの作成
  • 詳細情報

このガイドのコード例は、ドライバーソースコード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 配置に接続できます。

  • ポート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())
  • hostnameportを明示的に指定します。

    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オブジェクトを取得したら、コレクションにドキュメントを挿入できます。

コレクションにドキュメントを挿入するには、 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()

コレクション内のドキュメントを更新するには、コレクションのupdateOne() メソッドとupdateMany() メソッドを使用できます。

次のパラメーターをメソッドに渡します。

  • 更新するドキュメントを決定するためのフィルター オブジェクト。 フィルター オブジェクトの作成を容易にするために、ドライバーはFiltersヘルパー メソッドを提供します。 空のフィルターを指定してコレクション内のすべてのドキュメントを一致させるには、空のDocumentオブジェクトを使用します。

  • 変更を指定するドキュメントを更新します。 使用可能な演算子のリストを表示するには、サーバー マニュアルの「更新演算子 」を参照してください。

更新メソッドは、更新によって変更されたドキュメントの数など、操作に関する情報を提供するUpdateResultタイプを返します。

単一のドキュメントを更新するには、 updateOne()メソッドを使用します。

次の例では、 i10である最初のドキュメントを更新し、 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: ")

コレクションからドキュメントを削除するには、コレクションの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")

他のインデックス タイプのリストを表示するには、「インデックスの作成」ガイドを参照してください。

クイック スタート(大文字と小文字の例) 」ガイドでは、大文字と小文字 クラスでドライバーを使用する方法が示されています。

チュートリアル」セクションで、追加のチュートリアルを見つけることができます。

戻る

Primer