Docs Menu
Docs Home
/ / /
Java 同期
/ /

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

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 インスタンスへの接続の詳細については、接続ガイド を参照してください。

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);
Bson updates = Updates.combine(
Updates.addToSet("genres", "Frequently Discussed"),
Updates.currentTimestamp("lastUpdated"));
try {
UpdateResult result = collection.updateMany(query, updates);
System.out.println("Modified document count: " + result.getModifiedCount());
} 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{...}
}
},
...
]

Tip

Legacy API

レガシー API を使用している場合は、 FAQ ページ を参照して、このコード例に加える必要がある変更を確認してください。

このページで言及されているクラスとメソッドについて詳しくは、次の API ドキュメントを参照してください。

  • UpdateMany

  • UpdateOptions

  • 組み合わせ()

  • addToSet()

  • currentTimestamp()

  • UpdateResult

戻る

ドキュメントの更新