ドキュメントの更新
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 ドキュメントを参照してください。
例
この例では、sample_mflix
データベースの movies
コレクション内のクエリの最初の一致をアップデートします。一致するドキュメントに対して次のアップデートが行われます。
runtime
の値を99
に設定しますまだ存在しない場合にのみ、
genres
の配列にSports
を追加しますlastUpdated
の値を現在の時刻に設定します。
アップデート ドキュメントを構築するには、静的ヘルパー メソッドを含むファクトリー クラスであるUpdates
ビルダを使用します。 ビルダを使用する代わりにアップデートドキュメントを渡すこともできますが、ビルダーには型チェックと簡略化された構文が用意されています。 Updates
ビルダの詳細については、 アップデート ビルダに関するガイドをご覧ください。
注意
この例では、接続 URI を使用して MongoDB のインスタンスに接続します。 MongoDB インスタンスへの接続の詳細については、接続ガイド を参照してください。
package usage.examples; import org.bson.Document; import org.bson.conversions.Bson; import com.mongodb.MongoException; import com.mongodb.client.MongoClient; import com.mongodb.client.MongoClients; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import com.mongodb.client.model.UpdateOptions; import com.mongodb.client.model.Updates; import com.mongodb.client.result.UpdateResult; public class UpdateOne { public static void main(String[] args) { // Replace the uri string with your MongoDB deployment's connection string String uri = "<connection string uri>"; try (MongoClient mongoClient = MongoClients.create(uri)) { MongoDatabase database = mongoClient.getDatabase("sample_mflix"); MongoCollection<Document> collection = database.getCollection("movies"); Document query = new Document().append("title", "Cool Runnings 2"); Bson updates = Updates.combine( Updates.set("runtime", 99), Updates.addToSet("genres", "Sports"), Updates.currentTimestamp("lastUpdated")); UpdateOptions options = new UpdateOptions().upsert(true); try { UpdateResult result = collection.updateOne(query, updates, options); System.out.println("Modified document count: " + result.getModifiedCount()); System.out.println("Upserted id: " + result.getUpsertedId()); // only contains a value when an upsert is performed } catch (MongoException me) { System.err.println("Unable to update due to an error: " + me); } } } }
例を実行すると、次のような出力が表示されます。
Modified document count: 1 Upserted id: null
または、例でアップサートが発生した場合は、次のようになります。
Modified document count: 0 Upserted id: BsonObjectId{value=...}
アップデートされたドキュメントをクエリすると、次のようになります。
Document { { _id=..., plot=..., genres=[Adventure, Comedy, Family, Sports], runtime=99, ... lastUpdated=Timestamp{...} } }
このページで言及されているクラスとメソッドについて詳しくは、次の API ドキュメントを参照してください。