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

ドキュメントの更新

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コレクション内のクエリの最初の一致に対して次のアップデートが行われます。

  1. runtime の値を 99 に設定します

  2. まだ存在しない場合にのみ、 genresの配列にSportsを追加します

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

  • UpdateOne

  • UpdateOptions

  • 組み合わせ()

  • set()

  • addToSet()

  • currentDate()

  • UpdateResult

戻る

更新と置換