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

ドキュメントの更新

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{...}
}
}

Tip

Legacy API

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

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

戻る

更新と置換操作