書込み操作を実行して、新しいドキュメントの挿入、既存のドキュメントの更新、既存のドキュメントの置き換え、またはコレクションから既存のドキュメントを削除します。
前提条件
このガイドのコード例を実行するには、次のコンポーネントを設定する必要があります。
test.restaurantsドキュメントrestaurants.jsonアセットGithubの ファイルのドキュメントが入力された コレクション。次のインポート ステートメントは次のとおりです。
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 配置への接続
まず、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 への接続」チュートリアルを参照してください。
ドキュメントの挿入
コレクションに単一のドキュメントを挿入するには、コレクションの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 は 更新演算子 を提供します。 更新演算子を使用して実行する変更を指定するには、更新ドキュメントを作成します。 更新演算子の詳細については、サーバー マニュアルの「更新演算子 」を参照してください。
アップデート ドキュメントの作成を容易にするために、ドライバーは Updatesヘルパークラスを提供します。ビルダを使用してアップデートを指定する方法の詳細については、「アップデート ビルダ クラスのガイド」を参照してください。
重要
_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フィールドが存在しない場合、 演算子はそのフィールドをドキュメントに追加します。
Update Options
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()
Update Options
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()
Delete Documents
コレクション内のドキュメントを削除するには、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()
書込み保証 (write concern)
書込み保証 は書き込み操作に対して 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")
MongoDatabaseでwithWriteConcern()メソッドを使用することで、val database = mongoClient.getDatabase("test").withWriteConcern(WriteConcern.MAJORITY) MongoCollectionでwithWriteConcern()メソッドを使用することで、val collection = database.getCollection("restaurants").withWriteConcern(WriteConcern.MAJORITY)
MongoDatabase とMongoCollectionインスタンスは不変です。 既存のMongoDatabaseまたはMongoCollectionインスタンスでwithWriteConcern()を呼び出すと、新しい インスタンスが返されますが、メソッドが呼び出されるインスタンスには影響しません。
次の例では、 collWithWriteConcernインスタンスの書込み保証(write concern)はmajorityですが、 collectionの読み込み設定(read preference)は影響を受けません。
val collWithWriteConcern = collection.withWriteConcern(WriteConcern.MAJORITY)
MongoClientSettings 、 MongoDatabase 、またはMongoCollectionインスタンスをビルドすると、読み取り保証、読み込み設定(read preference)、書込み保証(write concern)の組み合わせを含めることができます。
たとえば、次のコードでは、コレクション レベルで 3 つすべてを設定します。
val collection = database.getCollection("restaurants") .withReadPreference(ReadPreference.primary()) .withReadConcern(ReadConcern.MAJORITY) .withWriteConcern(WriteConcern.MAJORITY)