書込み操作
項目一覧
書込み操作を実行して、新しいドキュメントの挿入、既存のドキュメントの更新、既存のドキュメントの置き換え、またはコレクションから既存のドキュメントを削除します。
前提条件
このガイドのコード例を実行するには、次のコンポーネントを設定する必要があります。
のドキュメント 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 配置への接続
まず、MongoDB 配置に接続し、 インスタンスとMongoDatabase
MongoCollection
インスタンスを 宣言して定義します。
次のコードは、ポート27017
のlocalhost
で実行されているスタンドアロンの 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
フィールドが存在しない場合、 演算子はそのフィールドをドキュメントに追加します。
Update Options
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>());
Update Options
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>());
Delete Documents
コレクション内のドキュメントを削除するには、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>());
書込み保証 (write concern)
書込み保証 は書き込み操作に対して 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");
MongoDatabase
でwithWriteConcern()
メソッドを使用することで、MongoDatabase database = mongoClient.getDatabase("test").withWriteConcern(WriteConcern.MAJORITY); MongoCollection
でwithWriteConcern()
メソッドを使用することで、MongoCollection<Document> collection = database .getCollection("restaurants") .withWriteConcern(WriteConcern.MAJORITY);
MongoDatabase
とMongoCollection
インスタンスは不変です。 既存のMongoDatabase
またはMongoCollection
インスタンスでwithWriteConcern()
を呼び出すと、新しい インスタンスが返されますが、メソッドが呼び出されるインスタンスには影響しません。
次の例では、 collWithWriteConcern
インスタンスの書込み保証(write concern)はmajority
ですが、 collection
の読み込み設定(read preference)は影響を受けません。
MongoCollection<Document> collWithWriteConcern = collection .withWriteConcern(WriteConcern.MAJORITY);
MongoClientSettings
、 MongoDatabase
、またはMongoCollection
インスタンスをビルドすると、読み取り保証、読み込み設定(read preference)、書込み保証(write concern)の組み合わせを含めることができます。
たとえば、次のコードでは、コレクション レベルで 3 つすべてを設定します。
Collection = database.getCollection("restaurants") .withReadPreference(ReadPreference.primary()) .withReadConcern(ReadConcern.MAJORITY) .withWriteConcern(WriteConcern.MAJORITY);