書込み操作
項目一覧
書込み操作を実行して、新しいドキュメントの挿入、既存のドキュメントの更新、既存のドキュメントの置き換え、またはコレクションから既存のドキュメントを削除します。
前提条件
このガイドのコード例を実行するには、次のコンポーネントを設定する必要があります。
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 配置への接続
まず、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 は 更新演算子 を提供します。 更新演算子を使用して実行する変更を指定するには、更新ドキュメントを作成します。 更新演算子の詳細については、サーバー マニュアルの「更新演算子 」を参照してください。
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
フィールドが存在しない場合、 演算子はそのフィールドをドキュメントに追加します。
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)