Overview
このガイドでは、 Scalaドライバーを使用してMongoDBコレクション内のドキュメントに対して置換操作を実行する方法を学習できます。置換操作すると、指定されたドキュメントから _idフィールドを除くすべてのフィールドと値が削除され、指定した新しいフィールドと値が追加されます。 この操作は、1 つ以上のドキュメントの指定されたフィールドのみを変更する 更新操作とは異なります。
アップデート操作の詳細については、ドキュメントのアップデートガイドを参照してください。
サンプル データ
restaurantssample_restaurantsこのガイドの例では、Atlasサンプルデータセット の データベースの コレクションを使用します。Scalaアプリケーションからこのコレクションにアクセスするには、Atlas クラスターに接続する MongoClientオブジェクトを作成し、database 変数と collection 変数に次の値を割り当てます。
val database: MongoDatabase = mongoClient.getDatabase("sample_restaurants") val collection: MongoCollection[Document] = database.getCollection("restaurants")
MongoDB Atlasクラスターを無料で作成して、サンプルデータセットをロードする方法については、MongoDBを使い始めるガイドを参照してください。
置換操作
MongoDBでは、replaceOne() メソッドを使用して置換操作を実行できます。 このメソッドは、指定されたクエリフィルターに一致する最初のドキュメントから _idフィールドを除くすべてのフィールドを削除します。 次に、指定したフィールドと値が空のドキュメントに追加されます。
必要なパラメーター
次のパラメータをreplaceOne()メソッドに渡す必要があります。
クエリフィルター。アップデートするドキュメントに一致する。 クエリフィルターの詳細については、「クエリの指定」ガイドを参照してください。
置換ドキュメント。既存のフィールドと値を置き換えるフィールドと値を指定します。
1 つのドキュメントの置換
次の例では、 replaceOne() メソッドを使用して、nameフィールドの値が "Primola Restaurant" であるドキュメントのフィールドと値を置き換えます。
val filter = equal("name", "Primola Restaurant") val replacement = Document( "name" -> "Frutti Di Mare", "borough" -> "Queens", "cuisine" -> "Seafood", "owner" -> "Sal Thomas" ) val observable: Observable[UpdateResult] = collection.replaceOne(filter, replacement) observable.subscribe(new Observer[UpdateResult] { override def onNext(result: UpdateResult): Unit = println(s"Replaced document count: ${result.getModifiedCount}") override def onError(e: Throwable): Unit = println(s"Failed: ${e.getMessage}") override def onComplete(): Unit = println("Completed") })
Replaced document count: 1 Completed
重要
_idフィールドの値は不変です。 置き換えドキュメントで_idフィールドの値を指定する場合、既存のドキュメントの _id 値と同じである必要があります。そうでない場合、ドライバーは WriteError を発生させます。
置換操作をカスタマイズする
replaceOne() メソッドは、オプションで ReplaceOptionsデータ型のパラメータを受け入れます。 ReplaceOptionsクラスには、置換オプションを構成するために使用できる setter メソッドが含まれています。 オプションを指定しない場合、ドライバーはデフォルト設定で置換操作を実行します。
次の表では、ReplaceOptionsクラスの setter メソッドを説明しています。
方式 | 説明 |
|---|---|
| クエリフィルターに一致するドキュメントがない場合に、置換操作でアップサート操作を実行するかどうかを指定します。詳細については、 MongoDB Serverマニュアルの「 アップサートの動作 」を参照してください。デフォルトは |
| 操作に適用するソート基準を設定します。 |
| アップデート操作がドキュメント検証をバイパスするかどうかを指定します。これにより、スキーマ検証要件を満たさないドキュメントを更新することができます(存在する場合)。スキーマ検証の詳細については、 MongoDB Serverマニュアルの「 スキーマバリデーション 」を参照してください。デフォルトは |
| 結果をソートするときに使用する言語照合の種類を指定します。 詳細については、MongoDB Server マニュアルの 「照合」 を参照してください。 |
| ドキュメントをマッチングするときに使用するインデックスを設定します。 詳細については、 MongoDB Serverマニュアルの ヒント ステートメントを参照してください。 |
| 操作の最上位変数を設定するためのパラメーター名と値のマップを提供します。値は、ドキュメントフィールドを参照しない定数または閉じた式である必要があります。 |
| 操作に添付するコメントを設定します。 |
次のコードでは、 upsertオプションをtrueに設定します。これは、クエリフィルターが既存のドキュメントと一致しない場合に、置換ドキュメントで指定されたフィールドと値を持つ新しいドキュメントを挿入するようにドライバーに指示します。
val options = ReplaceOptions().upsert(true) val observable: Observable[UpdateResult] = collection.replaceOne(filter, replacement, options) observable.subscribe(new Observer[UpdateResult] { override def onNext(result: UpdateResult): Unit = println(s"Replaced document count: ${result.getModifiedCount}") override def onError(e: Throwable): Unit = println(s"Failed: ${e.getMessage}") override def onComplete(): Unit = println("Completed") })
Replaced document count: 1 Completed
戻り値
replaceOne()メソッドはUpdateResultオブジェクトを返します。 UpdateResultインスタンスからの情報にアクセスするには、次のメソッドを使用できます。
方式 | 説明 |
|---|---|
| クエリフィルターに一致したドキュメントの数を返します。 |
| 更新操作によって変更されたドキュメントの数を返します。 更新されたドキュメントが元と同一の場合、このカウントには含まれません。 |
| サーバーが結果を確認した場合は |
| ドライバーがデータベースにアップサートしたドキュメントの |
詳細情報
ドキュメントを置き換える方法を示す実行可能なコード例については、「 MongoDB へのデータの書込み 」を参照してください。
API ドキュメント
このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。