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 ドキュメントを参照してください。
例
この例では、 Filtersビルダを使用して、「頻繁にディスカッションされる」というジャンル内の映画のクエリをフィルタリングします。
次に、 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 ドキュメントを参照してください。