複数のドキュメントの更新
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 ドキュメントを参照してください。
例
この例では、 sample_mflix
データベースのmovies
コレクション内のクエリに一致するドキュメントをアップデートします。 一致するドキュメントに対して次のアップデートが行われます。
まだ存在しない場合にのみ、
genres
の配列にFrequently Discussed
を追加しますlastUpdated
の値を現在の時刻に設定します。
アップデート ドキュメントを構築するには、静的ヘルパー メソッドを含むファクトリー クラスであるUpdates
ビルダを使用します。 ビルダを使用する代わりにアップデートドキュメントを渡すこともできますが、ビルダーには型チェックと簡略化された構文が用意されています。 詳しくは、 ビルダ セクションのアップデートに関するガイドをお読みください。
注意
この例では、接続 URI を使用して MongoDB のインスタンスに接続します。 MongoDB インスタンスへの接続の詳細については、接続ガイド を参照してください。
// Updates documents that match a query filter by using the Java driver package usage.examples; import static com.mongodb.client.model.Filters.gt; 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.Updates; import com.mongodb.client.result.UpdateResult; public class UpdateMany { 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"); Bson query = gt("num_mflix_comments", 50); // Creates instructions to update the values of two document fields Bson updates = Updates.combine( Updates.addToSet("genres", "Frequently Discussed"), Updates.currentTimestamp("lastUpdated")); try { // Updates documents that have a "num_mflix_comments" value over 50 UpdateResult result = collection.updateMany(query, updates); // Prints the number of updated documents System.out.println("Modified document count: " + result.getModifiedCount()); // Prints a message if any exceptions occur during the operation } catch (MongoException me) { System.err.println("Unable to update due to an error: " + me); } } } }
例を実行すると、次のような出力が表示されます。
Modified document count: 53
アップデートされたドキュメントをクエリすると、次のようになります。
[ Document { { _id=..., plot=..., genres=[..., Frequently Discussed, ...], ... lastUpdated=Timestamp{...} } }, ... ]
このページで言及されているクラスとメソッドについて詳しくは、次の API ドキュメントを参照してください。