Docs Menu
Docs Home
/ / /
Kotlin コルーチン
/ /

複数のドキュメントの更新

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 ドキュメントを参照してください。

  • UpdateMany

  • UpdateOptions

  • 組み合わせ()

  • addToSet()

  • currentDate()

  • UpdateResult

戻る

更新 1