Docs Menu
Docs Home
/ / /
Java Reactive Streams ドライバー
/

書込み操作

項目一覧

  • 前提条件
  • MongoDB 配置への接続
  • ドキュメントの挿入
  • 複数のドキュメントの挿入
  • 既存のドキュメントの更新
  • フィルター
  • 更新演算子
  • 単一ドキュメントの更新
  • 複数のドキュメントの更新
  • Update Options
  • 既存のドキュメントの置き換え
  • フィルター
  • ドキュメントの置き換え
  • Update Options
  • Delete Documents
  • フィルター
  • 単一ドキュメントの削除
  • 複数のドキュメントの削除
  • 書込み保証 (write concern)

書込み操作を実行して、新しいドキュメントの挿入、既存のドキュメントの更新、既存のドキュメントの置き換え、またはコレクションから既存のドキュメントを削除します。

このガイドのコード例を実行するには、次のコンポーネントを設定する必要があります。

  • のドキュメント 3}Github test.restaurantsドキュメントの ファイルのドキュメントが入力されたrestaurants.json {0 コレクション。

  • 次のインポート ステートメントは次のとおりです。

import com.mongodb.*;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;
import static com.mongodb.client.model.Filters.*;
import static com.mongodb.client.model.Updates.*;
import com.mongodb.client.model.UpdateOptions;
import com.mongodb.client.result.*;
import org.bson.Document;
import org.bson.types.ObjectId;
import java.util.List;
import java.util.Arrays;
import java.util.ArrayList;

重要

このガイドでは、 クイック スタート プライマリで説明されているSubscriberの実装を使用します。

まず、MongoDB 配置に接続し、 インスタンスとMongoDatabase MongoCollectionインスタンスを 宣言して定義します。

次のコードは、ポート27017localhostで実行されているスタンドアロンの MongoDB 配置に接続します。 次に、 testデータベースを参照するためのdatabase変数と、 restaurantsコレクションを参照するためのcollection変数を定義します。

MongoClient mongoClient = MongoClients.create();
MongoDatabase database = mongoClient.getDatabase("test");
MongoCollection<Document> collection = database.getCollection("restaurants");

MongoDB 配置への接続の詳細については、「 MongoDB への接続」チュートリアルを参照してください。

コレクションに単一のドキュメントを挿入するには、コレクションのinsertOne()メソッドを使用できます。

Document document = new Document("name", "Café Con Leche")
.append("contact", new Document("phone", "228-555-0149")
.append("email", "cafeconleche@example.com")
.append("location",Arrays.asList(-73.92502, 40.8279556)))
.append("stars", 3)
.append("categories", Arrays.asList("Bakery", "Coffee", "Pastries"));
collection.insertOne(document).subscribe(new ObservableSubscriber<Void>());

注意

ドキュメントに最上位のidフィールドが指定されていない場合、MongoDB は自動的に値を生成し、挿入されたドキュメントにこのフィールドを追加します。

複数のドキュメントを挿入するには、コレクションのinsertMany()メソッドを使用できます。このメソッドは、挿入するドキュメントのリストをパラメータとして受け取ります。

次の例では、 コレクションに 2 つのドキュメントを挿入します。

Document doc1 = new Document("name", "Amarcord Pizzeria")
.append("contact", new Document("phone", "264-555-0193")
.append("email", "amarcord.pizzeria@example.net")
.append("location",Arrays.asList(-73.88502, 40.749556)))
.append("stars", 2)
.append("categories", Arrays.asList("Pizzeria", "Italian", "Pasta"));
Document doc2 = new Document("name", "Blue Coffee Bar")
.append("contact", new Document("phone", "604-555-0102")
.append("email", "bluecoffeebar@example.com")
.append("location",Arrays.asList(-73.97902, 40.8479556)))
.append("stars", 5)
.append("categories", Arrays.asList("Coffee", "Pastries"));
List<Document> documents = new ArrayList<Document>();
documents.add(doc1);
documents.add(doc2);
collection.insertMany(documents).subscribe(new ObservableSubscriber<Void>());;

注意

ドキュメントに最上位のidフィールドが指定されていない場合、MongoDB は自動的に値を生成し、挿入されたドキュメントにこのフィールドを追加します。

コレクション内の既存のドキュメントを更新するには、コレクションの メソッドまたはupdateOne() updateMany()メソッドを使用できます。

メソッドにフィルター ドキュメントを渡して、アップデートするドキュメントを指定できます。 フィルター ドキュメントの仕様は、読み取り操作の と同じです。 フィルター オブジェクトの作成を容易にするために、ドライバーはFiltersヘルパー クラスを提供します。

空のフィルターを指定して、コレクション内のすべてのドキュメントをマッチングするには、空のDocumentオブジェクトをフィルターとして使用します。

ドキュメント内のフィールドを変更するために、MongoDB は 更新演算子 を提供します。 更新演算子を使用して実行する変更を指定するには、更新ドキュメントを作成します。 更新演算子の詳細については、サーバー マニュアルの「更新演算子 」を参照してください。

アップデート ドキュメントの作成を容易にするために、ドライバーはUpdatesヘルパー クラスを提供します。

重要

idフィールドは不変であるため、ドキュメント内のidフィールドの値を変更することはできません。

updateOne()メソッドは、フィルター条件がコレクション内の複数のドキュメントと一致する場合でも、単一のドキュメントを更新します。

restaurantsコレクションに対する次の操作では、 idフィールドの値がObjectId("57506d62f57802807471dd41")であるドキュメントを更新します。

collection.updateOne(
eq("_id", new ObjectId("57506d62f57802807471dd41")),
combine(set("stars", 1), set("contact.phone", "228-555-9999"), currentDate("lastModified"))
).subscribe(new ObservableSubscriber<UpdateResult>());

具体的には、この操作では次のメソッドが使用されます。

  • Updates.set() starsフィールドの値を1に、 contact.phoneフィールドの値を"228-555-9999"に設定する

  • Updates.currentDate() lastModifiedフィールドを現在の日付に変更します。 lastModifiedフィールドが存在しない場合、 演算子はそのフィールドをドキュメントに追加します。

updateMany()メソッドは、フィルター条件に一致するすべてのドキュメントをアップデートします。

restaurantsコレクションに対する次の操作は、 starsフィールドの値が2であるすべてのドキュメントを更新します。

collection.updateMany(
eq("stars", 2),
combine(set("stars", 0), currentDate("lastModified"))
).subscribe(new ObservableSubscriber<UpdateResult>());

具体的には、この操作では次のメソッドが使用されます。

  • Updates.set() starsフィールドの値を0に設定する

  • Updates.currentDate() lastModifiedフィールドを現在の日付に設定します。 lastModifiedフィールドが存在しない場合、 演算子はそのフィールドをドキュメントに追加します。

updateOne()メソッドとupdateMany()メソッドを使用する場合、 upsertオプションまたはbypassDocumentationValidationオプションを指定するためにUpdateOptionsドキュメントを含めることができます。

collection.updateOne(
eq("_id", 1),
combine(set("name", "Fresh Breads and Tulips"), currentDate("lastModified")),
new UpdateOptions().upsert(true).bypassDocumentValidation(true)
).subscribe(new ObservableSubscriber<UpdateResult>());

コレクション内の既存のドキュメントを置き換えるには、コレクションのreplaceOne()メソッドを使用できます。

重要

idフィールドは不変であるため、ドキュメント内のidフィールドを置き換えることはできません。

フィルター ドキュメントをreplaceOne()メソッドに渡して、置き換えるドキュメントを指定できます。 フィルター ドキュメントの仕様は、読み取り操作の と同じです。 フィルター オブジェクトの作成を容易にするために、ドライバーはFiltersヘルパー クラスを提供します。

空のフィルターを指定して、コレクション内のすべてのドキュメントをマッチングするには、空のDocumentオブジェクトをフィルターとして使用します。

replaceOne()メソッドは、フィルター条件がコレクション内の複数のドキュメントに一致する場合でも、最大で 1 つのドキュメントを置き換えます。

ドキュメントを置き換えるには、新しいドキュメントをreplaceOne()メソッドに渡します。

重要

置き換えドキュメントには、元のドキュメントとは異なるフィールドを含めることができます。 置き換えドキュメントでは、 idフィールドが不変であるため、 idフィールドを省略できます。 ただし、 idフィールドを含める場合は、 idフィールドに別の値を指定できません。

restaurantsコレクションに対する次の操作は、 idフィールドの値がObjectId("57506d62f57802807471dd41")であるドキュメントを置き換えます。

collection.replaceOne(
eq("_id", new ObjectId("57506d62f57802807471dd41")),
new Document("name", "Green Salads Buffet")
.append("contact", "TBD")
.append("categories", Arrays.asList("Salads", "Health Foods", "Buffet"))
).subscribe(new ObservableSubscriber<UpdateResult>());

replaceOne()メソッドを使用する場合、 UpdateOptionsドキュメントを含めてupsertオプションまたはbypassDocumentationValidationオプションを指定できます。

collection.replaceOne(
eq("name", "Orange Patisserie and Gelateria"),
new Document("stars", 5)
.append("contact", "TBD")
.append("categories", Arrays.asList("Cafe", "Pastries", "Ice Cream")),
new UpdateOptions().upsert(true).bypassDocumentValidation(true)
).subscribe(new ObservableSubscriber<UpdateResult>());

コレクション内のドキュメントを削除するには、deleteOne() メソッドとdeleteMany() メソッドを使用できます。

メソッドにフィルター ドキュメントを渡して、削除するドキュメントを指定できます。 フィルター ドキュメントの仕様は、読み取り操作の と同じです。 フィルター オブジェクトの作成を容易にするために、ドライバーはFiltersヘルパー クラスを提供します。

空のフィルターを指定して、コレクション内のすべてのドキュメントをマッチングするには、空のDocumentオブジェクトをフィルターとして使用します。

deleteOne()メソッドは、フィルター条件がコレクション内の複数のドキュメントと一致する場合でも、最大で 1 つのドキュメントを削除します。

restaurantsコレクションに対する次の操作は、 _idフィールドの値がObjectId("57506d62f57802807471dd41")であるドキュメントを削除します。

collection
.deleteOne(eq("_id", new ObjectId("57506d62f57802807471dd41")))
.subscribe(new ObservableSubscriber<DeleteResult>());

deleteMany()メソッドは、フィルター条件に一致するすべてのドキュメントを削除します。

restaurantsコレクションに対して次の操作を実行すると、 starsフィールドの値が4であるすべてのドキュメントが削除されます。

collection
.deleteMany(eq("stars", 4))
.subscribe(new ObservableSubscriber<DeleteResult>());

書込み保証 は書き込み操作に対して MongoDB から要求される確認応答のレベルを表します。

書込み保証 (write concern) は、次のレベルで構成できます。

  • 次の方法でMongoClientで実行されます。

    • MongoClientSettingsインスタンスを作成する方法

      MongoClient mongoClient = MongoClients.create(MongoClientSettings.builder()
      .applyConnectionString(new ConnectionString("mongodb://host1,host2"))
      .writeConcern(WriteConcern.MAJORITY)
      .build());
    • ConnectionStringインスタンスを作成する方法

      MongoClient mongoClient = MongoClients.create("mongodb://host1:27017,host2:27017/?w=majority");
  • MongoDatabasewithWriteConcern()メソッドを使用することで、

    MongoDatabase database = mongoClient.getDatabase("test").withWriteConcern(WriteConcern.MAJORITY);
  • MongoCollectionwithWriteConcern()メソッドを使用することで、

    MongoCollection<Document> collection = database
    .getCollection("restaurants")
    .withWriteConcern(WriteConcern.MAJORITY);

MongoDatabaseMongoCollectionインスタンスは不変です。 既存のMongoDatabaseまたはMongoCollectionインスタンスでwithWriteConcern()を呼び出すと、新しい インスタンスが返されますが、メソッドが呼び出されるインスタンスには影響しません。

次の例では、 collWithWriteConcernインスタンスの書込み保証(write concern)はmajorityですが、 collectionの読み込み設定(read preference)は影響を受けません。

MongoCollection<Document> collWithWriteConcern = collection
.withWriteConcern(WriteConcern.MAJORITY);

MongoClientSettingsMongoDatabase 、またはMongoCollectionインスタンスをビルドすると、読み取り保証、読み込み設定(read preference)、書込み保証(write concern)の組み合わせを含めることができます。

たとえば、次のコードでは、コレクション レベルで 3 つすべてを設定します。

Collection = database.getCollection("restaurants")
.withReadPreference(ReadPreference.primary())
.withReadConcern(ReadConcern.MAJORITY)
.withWriteConcern(WriteConcern.MAJORITY);

戻る

クライアント側の暗号化