ドキュメントの更新
MongoCollection
オブジェクトの updateOne()
メソッドを使用して、単一のドキュメントをアップデートできます。このメソッドは、アップデートするドキュメントに一致する filter と、一致するドキュメントを変更する方法をドライバーに指示する update ステートメントを受け入れます。updateOne()
メソッドは、フィルターに一致する最初のドキュメントのみをアップデートします。
updateOne()
メソッドを使用してアップデートを実行するには、クエリフィルターとアップデート ドキュメントを渡す必要があります。クエリフィルターは、アップデートを実行するドキュメントの基準を指定し、アップデート ドキュメントは、そのドキュメントに加える変更内容に関する指示を提供します。
メソッドの動作を指定するために、オプションで UpdateOptions
のインスタンスを updateOne()
メソッドに渡すことができます。たとえば、UpdateOptions
オブジェクトの upsert
フィールドを true
に設定すると、クエリフィルターに一致するドキュメントがない場合、この操作によって、クエリ ドキュメントとアップデート ドキュメントの両方のフィールドから新しいドキュメントが挿入されます。詳しくは、このページの下部にある UpdateOptions
API ドキュメントへのリンクを参照してください。
正常に実行されると、updateOne()
メソッドは UpdateResult
のインスタンスを返します。getModifiedCount()
メソッドを呼び出すことで変更されたドキュメントの数などの情報を取得できます。また、UpdateOptions
インスタンスで upsert(true)
を指定した場合は、getUpsertedId()
メソッドを呼び出すことで _id
フィールドの値を取得できます。
アップデート操作に失敗した場合、ドライバーは例外を発生させます。たとえば、アップデート ドキュメント内の不変フィールド _id
に値を設定しようとすると、メソッドは次のメッセージとともに MongoWriteException
を返します。
Performing an update on the path '_id' would modify the immutable field '_id'
アップデート ドキュメントに一意なインデックスのルールに違反する変更が含まれている場合、メソッドは次のようなエラー メッセージを含むMongoWriteException
を返します。
E11000 duplicate key error collection: ...
特定の条件下で発生する例外の種類の詳細については、このページの下部にリンクしているupdateOne()
API ドキュメントを参照してください。
例
この例では、 Filter
ビルダを使用して、 コレクション内で「Coll Runnings 2」というタイトルの映画をクエリします。
次に、 sample_mflix
データベースのmovies
コレクション内のクエリの最初の一致に対して次のアップデートが行われます。
runtime
の値を99
に設定しますまだ存在しない場合にのみ、
genres
の配列にSports
を追加しますlastUpdated
の値を現在の時刻に設定
アップデート ドキュメントを構築するには、静的ヘルパー メソッドを含むファクトリー クラスであるUpdates
ビルダを使用します。 ビルダを使用する代わりにアップデートドキュメントを渡すこともできますが、ビルダーには型チェックと簡略化された構文が用意されています。 詳しくは、アップデート ビルダのガイドを参照してください。
注意
この例では、接続 URI を使用して MongoDB のインスタンスに接続します。 MongoDB インスタンスへの接続の詳細については、接続ガイド を参照してください。
import com.mongodb.MongoException import com.mongodb.client.model.Filters import com.mongodb.client.model.UpdateOptions 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 title: String, val runtime: 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.eq(Movie::title.name, "Cool Runnings 2") val updates = Updates.combine( Updates.set(Movie::runtime.name, 99), Updates.addToSet(Movie::genres.name, "Sports"), Updates.currentDate(Movie::lastUpdated.name) ) val options = UpdateOptions().upsert(true) try { val result = collection.updateOne(query, updates, options) println("Modified document count: " + result.modifiedCount) println("Upserted id: " + result.upsertedId) // only contains a non-null value when an upsert is performed } catch (e: MongoException) { System.err.println("Unable to update due to an error: $e") } mongoClient.close() }
例を実行すると、次のような出力が表示されます。
Modified document count: 1 Upserted id: null
または、例でアップサートが発生した場合は、次のようになります。
Modified document count: 0 Upserted id: BsonObjectId{value=...}
アップデートされたドキュメントをクエリすると、次のようになります。
Movie(title=Cool Runnings 2, runtime=99, genres=[ ... Sports], lastUpdated= ... )
このページで言及されているクラスとメソッドについて詳しくは、次の API ドキュメントを参照してください。