複数のドキュメントの更新
MongoCollection
オブジェクトで updateMany()
メソッドを使用して複数のドキュメントを更新できます。 このメソッドは、アップデートするドキュメントに一致するfilterと、一致するドキュメントを変更する方法をドライバーに指示するupdateステートメントを受け入れます。 updateMany()
メソッドは、コレクション内でフィルターに一致する すべての ドキュメントをアップデートします。
updateMany()
メソッドを使用してアップデートを実行するには、クエリフィルターとアップデート ドキュメントを渡す必要があります。 クエリフィルターは、コレクション内のどのドキュメントを一致させるかを指定し、アップデート ドキュメントは、それらに加える変更内容に関する指示を提供します。
呼び出しの動作を変更するには、オプションで、 UpdateOptions
のインスタンスをupdateMany()
メソッドに渡すことができます。 たとえば、 UpdateOptions
オブジェクトのupsert
フィールドをtrue
に設定し、かつ指定されたクエリフィルターに一致するドキュメントがない場合、この操作によって、クエリ ドキュメントとアップデート ドキュメントの両方のフィールドで構成される新しいドキュメントが挿入されます。
正常に実行されると、 updateMany()
メソッドはUpdateResult
のインスタンスを返します。 getModifiedCount()
メソッドを呼び出すと、変更されたドキュメントの数などの情報を取得できます。 UpdateOptions
オブジェクトでupsert(true)
を指定し、その操作によって挿入が行われた場合は、 UpdateResult
インスタンスでgetUpsertedId()
メソッドを呼び出すことで、新しいドキュメントの_id
フィールドを検索できます。
アップデート操作に失敗した場合、ドライバーは例外を発生させ、フィルターに一致するドキュメントをアップデートしません。 たとえば、アップデート ドキュメント内の不変フィールド_id
に値を設定しようとすると、 updateMany()
メソッドはドキュメントをアップデートせず、次のメッセージとともにMongoWriteException
をスローします。
Performing an update on the path '_id' would modify the immutable field '_id'
アップデート ドキュメントに一意なインデックスのルールに違反する変更が含まれている場合、メソッドは次のようなエラー メッセージを含むMongoWriteException
を返します。
E11000 duplicate key error collection: ...
特定の条件で発生する例外の種類の詳細については、このページの下部にリンクしているupdateMany()
の API ドキュメントを参照してください。
例
この例では、 Filter
ビルダを使用して、「頻繁にディスカッションされる」というジャンル内の映画のクエリをフィルタリングします。
次に、 sample_mflix
データベースのmovies
コレクション内のクエリに一致するドキュメントをアップデートします。 一致するドキュメントに対して次のアップデートが行われます。
まだ存在しない場合にのみ、
genres
の配列にFrequently Discussed
を追加しますlastUpdated
の値を現在の時刻に設定します。
アップデート ドキュメントを構築するには、静的ヘルパー メソッドを含むファクトリー クラスであるUpdates
ビルダを使用します。 ビルダを使用する代わりにアップデートドキュメントを渡すこともできますが、ビルダーには型チェックと簡略化された構文が用意されています。 詳しくは、 ビルダ セクションのアップデートに関するガイドをお読みください。
注意
この例では、接続 URI を使用して MongoDB のインスタンスに接続します。 MongoDB インスタンスへの接続の詳細については、接続ガイド を参照してください。
import com.mongodb.MongoException import com.mongodb.client.model.Filters import com.mongodb.client.model.Updates import com.mongodb.kotlin.client.coroutine.MongoClient import kotlinx.coroutines.runBlocking import java.time.LocalDateTime data class Movie( val num_mflix_comments: Int, val genres: List<String>, val lastUpdated: LocalDateTime ) fun main() = runBlocking { // Replace the uri string with your MongoDB deployment's connection string val uri = "<connection string uri>" val mongoClient = MongoClient.create(uri) val database = mongoClient.getDatabase("sample_mflix") val collection = database.getCollection<Movie>("movies") val query = Filters.gt(Movie::num_mflix_comments.name, 50) val updates = Updates.combine( Updates.addToSet(Movie::genres.name, "Frequently Discussed"), Updates.currentDate(Movie::lastUpdated.name) ) try { val result = collection.updateMany(query, updates) println("Modified document count: " + result.modifiedCount) } catch (e: MongoException) { System.err.println("Unable to update due to an error: $e") } mongoClient.close() }
Modified document count: 53
例を実行すると、同様の出力が表示されます。
アップデートされたドキュメントをクエリすると、次のようになります。
Movie(num_mflix_comments=100, genres=[ ... Frequently Discussed], lastUpdated= ... )
このページで言及されているクラスとメソッドについて詳しくは、次の API ドキュメントを参照してください。