Docs Menu
Docs Home
/ / /
Scala
/

書込み操作

項目一覧

  • 前提条件
  • MongoDB 配置への接続
  • ドキュメントの挿入
  • 複数のドキュメントの挿入
  • 既存のドキュメントの更新
  • フィルター
  • 更新演算子
  • 単一ドキュメントの更新
  • 複数のドキュメントの更新
  • Update Options
  • 既存のドキュメントの置き換え
  • フィルター
  • ドキュメントの置き換え
  • Update Options
  • Delete Documents
  • フィルター
  • 単一ドキュメントの削除
  • 複数のドキュメントの削除
  • 書込み保証 (write concern)

書込み操作を実行して、新しいドキュメントの挿入、既存のドキュメントの更新、既存のドキュメントの置き換え、またはコレクションから既存のドキュメントを削除します。

このガイドのコード例を実行するには、次のコンポーネントを設定する必要があります。

  • GitHub の test.restaurantsドキュメントrestaurants.json アセットの ファイルのドキュメントが入力された コレクション。

  • 次のインポート ステートメントは次のとおりです。

import org.mongodb.scala._
import org.mongodb.scala.model._
import org.mongodb.scala.model.Filters._
import org.mongodb.scala.model.Updates._
import org.mongodb.scala.model.UpdateOptions
import org.mongodb.scala.bson.BsonObjectId

注意

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

まず、MongoDB 配置に接続し、 インスタンスとMongoDatabase MongoCollectionインスタンスを 宣言して定義します。

次のコードは、ポート27017localhostで実行されているスタンドアロンの MongoDB 配置に接続します。 次に、 testデータベースを参照するためのdatabase変数と、 restaurantsコレクションを参照するためのcollection変数を定義します。

val mongoClient: MongoClient = MongoClient()
val database: MongoDatabase = mongoClient.getDatabase("test")
val collection: MongoCollection[Document] = database.getCollection("restaurants")

MongoDB 配置への接続の詳細については、「 MongoDB への接続」チュートリアルを参照してください。

コレクションに単一のドキュメントを挿入するには、コレクションのinsertOne()メソッドを使用できます。

val document = Document("name" -> "Café Con Leche" ,
"contact" -> Document("phone" -> "228-555-0149",
"email" -> "cafeconleche@example.com",
"location" -> Seq(-73.92502, 40.8279556)),
"stars" -> 3, "categories" -> Seq("Bakery", "Coffee", "Pastries"))
collection.insertOne(document).printResults()

注意

ドキュメントに最上位の_idフィールドが指定されていない場合、MongoDB は自動的に値を生成し、挿入されたドキュメントにこのフィールドを追加します。

複数のドキュメントを挿入するには、コレクションのinsertMany()メソッドを使用できます。このメソッドは、挿入するドキュメントのリストをパラメータとして受け取ります。

次の例では、 コレクションに 2 つのドキュメントを挿入します。

val doc1 = Document("name" -> "Amarcord Pizzeria" ,
"contact" -> Document("phone" -> "264-555-0193",
"email" -> "amarcord.pizzeria@example.net",
"location" -> Seq(-73.88502, 40.749556)),
"stars" -> 2, "categories" -> Seq("Pizzeria", "Italian", "Pasta"))
val doc2 = Document("name" -> "Blue Coffee Bar" ,
"contact" -> Document("phone" -> "604-555-0102",
"email" -> "bluecoffeebar@example.com",
"location" -> Seq(-73.97902, 40.8479556)),
"stars" -> 5, "categories" -> Seq("Coffee", "Pastries"))
collection.insertMany(Seq(doc1, doc2)).printResults()

注意

ドキュメントに最上位の_idフィールドが指定されていない場合、MongoDB は自動的に値を生成し、挿入されたドキュメントにこのフィールドを追加します。

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

メソッドにフィルター ドキュメントを渡して、アップデートするドキュメントを指定できます。 フィルター ドキュメントの仕様は、読み取り操作の と同じです。 フィルター オブジェクトの作成を容易にするために、ドライバーはFiltersヘルパー クラスを提供します。

空のフィルターを指定して、コレクション内のすべてのドキュメントをマッチングするには、空のDocumentオブジェクトをフィルターとして使用します。

ドキュメント内のフィールドを変更するために、MongoDB は 更新演算子 を提供します。 更新演算子を使用して実行する変更を指定するには、更新ドキュメントを作成します。 更新演算子の詳細については、サーバー マニュアルの「更新演算子 」を参照してください。

To facilitate the creation of update documents, the driver provides the Updates helper class. ビルダを使用してアップデートを指定する方法の詳細については、「アップデートガイド 」を参照してください。

重要

_idフィールドは不変であるため、ドキュメント内の_idフィールドの値を変更することはできません。

updateOne()メソッドは、フィルター条件がコレクション内の複数のドキュメントと一致する場合でも、単一のドキュメントを更新します。

restaurantsコレクションに対する次の操作では、 _idフィールドの値がBsonObjectId("57506d62f57802807471dd41")であるドキュメントを更新します。

collection.updateOne(
equal("_id", BsonObjectId("57506d62f57802807471dd41")),
combine(set("stars", 1), set("contact.phone", "228-555-9999"), currentDate("lastModified")))
.printResults()

具体的には、この操作では次のメソッドが使用されます。

  • Updates.set() starsフィールドの値を1に、 contact.phoneフィールドの値を"228-555-9999"に設定する

  • Updates.currentDate() lastModifiedフィールドを現在の日付に変更します。 lastModifiedフィールドが存在しない場合、 演算子はそのフィールドをドキュメントに追加します。

updateMany()メソッドは、フィルター条件に一致するすべてのドキュメントをアップデートします。

restaurantsコレクションに対する次の操作は、 starsフィールドの値が2であるすべてのドキュメントを更新します。

collection.updateMany(
equal("stars", 2),
combine(set("stars", 0), currentDate("lastModified")))
.println()

具体的には、この操作では次のメソッドが使用されます。

  • Updates.set() starsフィールドの値を0に設定する

  • Updates.currentDate() lastModifiedフィールドを現在の日付に設定します。 lastModifiedフィールドが存在しない場合、 演算子はそのフィールドをドキュメントに追加します。

updateOne()メソッドとupdateMany()メソッドを使用する場合、 upsertオプションまたはbypassDocumentationValidationオプションを指定するためにUpdateOptionsドキュメントを含めることができます。

collection.updateOne(
equal("_id", 1),
combine(set("name", "Fresh Breads and Tulips"), currentDate("lastModified")),
UpdateOptions().upsert(true).bypassDocumentValidation(true))
.printResults()

コレクション内の既存のドキュメントを置き換えるには、コレクションのreplaceOne()メソッドを使用できます。

重要

_idフィールドは不変であるため、ドキュメント内の_idフィールドを置き換えることはできません。

フィルター ドキュメントをreplaceOne()メソッドに渡して、置き換えるドキュメントを指定できます。 フィルター ドキュメントの仕様は、読み取り操作の と同じです。 フィルター オブジェクトの作成を容易にするために、ドライバーはFiltersヘルパー クラスを提供します。

空のフィルターを指定して、コレクション内のすべてのドキュメントをマッチングするには、空のDocumentオブジェクトをフィルターとして使用します。

replaceOne()メソッドは、フィルター条件がコレクション内の複数のドキュメントに一致する場合でも、最大で 1 つのドキュメントを置き換えます。

ドキュメントを置き換えるには、新しいドキュメントをreplaceOne()メソッドに渡します。

重要

置き換えドキュメントには、元のドキュメントとは異なるフィールドを含めることができます。 置き換えドキュメントでは、 _idフィールドが不変であるため、 _idフィールドを省略できます。 ただし、 _idフィールドを含める場合は、 _idフィールドに別の値を指定できません。

restaurantsコレクションに対する次の操作は、 _idフィールドの値がBsonObjectId("57506d62f57802807471dd41")であるドキュメントを置き換えます。

collection.replaceOne(
equal("_id", BsonObjectId("57506d62f57802807471dd41")),
Document("name" -> "Green Salads Buffet", "contact" -> "TBD",
"categories" -> Seq("Salads", "Health Foods", "Buffet")))
.printResults()

replaceOne()メソッドを使用する場合、 UpdateOptionsドキュメントを含めてupsertオプションまたはbypassDocumentationValidationオプションを指定できます。

collection.replaceOne(
equal("name", "Orange Patisserie and Gelateria"),
Document("stars" -> 5, "contact" -> "TBD",
"categories" -> Seq("Cafe", "Pastries", "Ice Cream")),
UpdateOptions().upsert(true).bypassDocumentValidation(true))
.printResults()

コレクション内のドキュメントを削除するには、deleteOne() メソッドとdeleteMany() メソッドを使用できます。

メソッドにフィルター ドキュメントを渡して、削除するドキュメントを指定できます。 フィルター ドキュメントの仕様は、読み取り操作の と同じです。 フィルター オブジェクトの作成を容易にするために、ドライバーはFiltersヘルパー クラスを提供します。

空のフィルターを指定して、コレクション内のすべてのドキュメントをマッチングするには、空のDocumentオブジェクトをフィルターとして使用します。

deleteOne()メソッドは、フィルター条件がコレクション内の複数のドキュメントと一致する場合でも、最大で 1 つのドキュメントを削除します。

restaurantsコレクションに対する次の操作は、 _idフィールドの値がObjectId("57506d62f57802807471dd41")であるドキュメントを削除します。

collection.deleteOne(equal("_id", new ObjectId("57506d62f57802807471dd41"))).subscribe(new ObservableSubscriber<DeleteResult>())

deleteMany()メソッドは、フィルター条件に一致するすべてのドキュメントを削除します。

restaurantsコレクションに対して次の操作を実行すると、 starsフィールドの値が4であるすべてのドキュメントが削除されます。

collection.deleteMany(equal("stars", 4)).printResults()

書込み保証 は書き込み操作に対して MongoDB から要求される確認応答のレベルを表します。

書込み保証 (write concern) は、次のレベルで構成できます。

  • 次の方法でMongoClientで実行されます。

    • MongoClientSettingsインスタンスを作成する方法

      val mongoClient: MongoClient = MongoClient(MongoClientSettings.builder()
      .applyConnectionString(ConnectionString("mongodb://host1,host2"))
      .writeConcern(WriteConcern.MAJORITY)
      .build())
    • ConnectionStringインスタンスを作成する方法

      val mongoClientt = MongoClient("mongodb://host1:27017,host2:27017/?w=majority")
  • MongoDatabasewithWriteConcern()メソッドを使用することで、

    val database = mongoClient.getDatabase("test").withWriteConcern(WriteConcern.MAJORITY)
  • MongoCollectionwithWriteConcern()メソッドを使用することで、

    val collection = database.getCollection("restaurants").withWriteConcern(WriteConcern.MAJORITY)

MongoDatabaseMongoCollectionインスタンスは不変です。 既存のMongoDatabaseまたはMongoCollectionインスタンスでwithWriteConcern()を呼び出すと、新しい インスタンスが返されますが、メソッドが呼び出されるインスタンスには影響しません。

次の例では、 collWithWriteConcernインスタンスの書込み保証(write concern)はmajorityですが、 collectionの読み込み設定(read preference)は影響を受けません。

val collWithWriteConcern = collection.withWriteConcern(WriteConcern.MAJORITY)

MongoClientSettingsMongoDatabase 、またはMongoCollectionインスタンスをビルドすると、読み取り保証、読み込み設定(read preference)、書込み保証(write concern)の組み合わせを含めることができます。

たとえば、次のコードでは、コレクション レベルで 3 つすべてを設定します。

val collection = database.getCollection("restaurants")
.withReadPreference(ReadPreference.primary())
.withReadConcern(ReadConcern.MAJORITY)
.withWriteConcern(WriteConcern.MAJORITY)

戻る

使用中の暗号化