1。概要
MongoDBは、一般に公開されているドキュメント指向のNoSQLデータベースです。 update などのさまざまな方法を使用して、コレクション内のドキュメントを更新できます。 、交換 および保存 。ドキュメントの特定のフィールドを変更するために、 $ setなどのさまざまな演算子を使用します 、 $ inc、 など
このチュートリアルでは、 updateを使用してドキュメントの複数のフィールドを変更する方法を学習します。 および置換 クエリ。デモンストレーションの目的で、最初にmongoシェルクエリについて説明し、次にJavaでの対応する実装について説明します。
それでは、目的を達成するためのさまざまな方法を見てみましょう。
2。さまざまなフィールドを更新するためのシェルクエリ
始める前に、まず新しいデータベース baeldungを作成しましょう。 、およびサンプルコレクション、従業員 。すべての例でこのコレクションを使用します:
use baeldung;
db.createCollection(employee);
insertMany を使用して、このコレクションにいくつかのドキュメントを追加しましょう。 クエリ:
db.employee.insertMany([
{
"employee_id": 794875,
"employee_name": "David Smith",
"job": "Sales Representative",
"department_id": 2,
"salary": 20000,
"hire_date": NumberLong("1643969311817")
},
{
"employee_id": 794876,
"employee_name": "Joe Butler",
"job": "Sales Manager",
"department_id": 3,
"salary": 30000,
"hire_date": NumberLong("1645338658000")
}
]);
その結果、以下に示すように、両方のドキュメントに対してObjectIdを含むJSONが取得されます。
{
"acknowledged": true,
"insertedIds": [
ObjectId("6211e034b76b996845f3193d"),
ObjectId("6211e034b76b996845f3193e")
]
}
これまでに、必要な環境を設定しました。挿入したばかりのドキュメントを更新しましょう。
2.1。 1つのドキュメントの複数のフィールドを更新する
$ setを使用できます および$inc MongoDBの任意のフィールドを更新する演算子。 $ set $ inc の間に、演算子は新しく指定された値を設定します 演算子は、指定された値だけ値を増やします。
最初にMongoDBクエリを調べて、 $ setを使用して従業員コレクションの2つのフィールドを更新しましょう。 演算子:
db.employee.updateOne(
{
"employee_id": 794875,
"employee_name": "David Smith"
},
{
$set:{
department_id:3,
job:"Sales Manager"
}
}
);
上記のクエリでは、 employee_id およびemployee_name フィールドは、ドキュメントと $ setをフィルタリングするために使用されます 演算子はジョブを更新するために使用されます およびdepartment_id フィールド。
$ setを使用することもできます および$inc 単一の更新クエリで演算子を一緒に:
db.employee.updateOne(
{
"employee_id": 794875
},
{
$inc: {
department_id: 1
},
$set: {
job: "Sales Manager"
}
}
);
これにより、ジョブが更新されます フィールドをセールスマネージャーに送信し、 department_idを増やします。 1で。
2.2。複数のドキュメントの複数のフィールドを更新する
さらに、MongoDBの複数のドキュメントの複数のフィールドを更新することもできます。オプションmulti:trueを含める必要があります フィルタクエリ条件に一致するすべてのドキュメントを変更するには:
db.employee.update(
{
"job": "Sales Representative"
},
{
$inc: {
salary: 10000
},
$set: {
department_id: 5
}
},
{
multi: true
}
);
または、 updateManyを使用して同じ結果を取得します クエリ:
db.employee.updateMany(
{
"job": "Sales Representative"
},
{
$inc: {
salary: 10000
},
$set: {
department_id: 5
}
}
);
上記のクエリでは、 updateManyを使用しました コレクションの複数のドキュメントを更新する方法。
2.3。複数のフィールドを更新する際の一般的な問題
これまで、2つの異なる演算子を提供するか、複数のフィールドで1つの演算子を使用して、更新クエリを使用して複数のフィールドを更新する方法を学びました。
これで、1つのクエリで異なるフィールドで演算子を複数回使用すると、MongoDBは更新クエリの最後のステートメントのみを更新します 残りは無視してください:
db.employee.updateMany(
{
"employee_id": 794875
},
{
$set: {
department_id: 3
},
$set: {
job:"Sales Manager"
}
}
);
上記のクエリは、これと同様の出力を返します:
{
"acknowledged":true,
"matchedCount":1,
"modifiedCount":1
}
この場合、唯一のジョブ 「セールスマネージャー」に更新されます。 department_id 値は3に更新されません。
3。 Javaドライバーでフィールドを更新する
これまで、生のMongoDBクエリについて説明してきました。 Javaを使用して同じ操作を実行してみましょう。 MongoDB Javaドライバーは、MongoDBドキュメントを表す2つのクラス com.mongodb.BasicDBObject をサポートしています。 およびorg.bson.Document。 ドキュメントのフィールドを更新するための両方の方法を検討します。
先に進む前に、まず従業員に接続しましょう baeldung内のコレクション DB:
MongoClient mongoClient = new MongoClient(new MongoClientURI("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("baeldung");
MongoCollection<Document> collection = database.getCollection("employee");
ここでは、MongoDBがデフォルトのポート27017でローカルに実行されていると想定しています。
3.1。 DBObjectの使用
MongoDBでドキュメントを作成するには、com.mongodb。を使用します。 DBObjectインターフェースとその実装クラスcom.mongodb.BasicDBObject 。
DBObjectの実装 キーと値のペアに基づいています。BasicDBObject LinkedHashMapから継承されます utilにあるクラス パッケージ。
com.mongodb.BasicDBObjectを使用してみましょう 複数のフィールドで更新操作を実行するには:
BasicDBObject searchQuery = new BasicDBObject("employee_id", 794875);
BasicDBObject updateFields = new BasicDBObject();
updateFields.append("department_id", 3);
updateFields.append("job", "Sales Manager");
BasicDBObject setQuery = new BasicDBObject();
setQuery.append("$set", updateFields);
UpdateResult updateResult = collection.updateMany(searchQuery, setQuery);
ここでは、最初に、employee_idに基づいてフィルタークエリを作成しました。 この操作により、一連のドキュメントが返されます。さらに、 department_idの値を更新しました およびジョブ 設定されたクエリによると。
3.2。 bsonの使用 ドキュメント
bson を使用して、すべてのMongoDB操作を実行できます。 資料。そのためには、まずコレクションオブジェクトが必要であり、次に updateManyを使用して更新操作を実行します。 フィルターを使用したメソッド およびセット 機能。
UpdateResult updateQueryResult = collection.updateMany(Filters.eq("employee_id", 794875),
Updates.combine(Updates.set("department_id", 3), Updates.set("job", "Sales Manager")));
ここでは、クエリフィルターを updateManyに渡します。 方法。 eq フィルタはemployee_idと一致します 完全に一致するテキスト「794875」を使用します。次に、 department_idを更新します と仕事 セットを使用する オペレーター。
4。置換クエリの使用
ドキュメントの複数のフィールドを更新するための単純なアプローチは、値が更新された新しいドキュメントに置き換えることです。
たとえば、ドキュメントを employee_idに置き換えたい場合 794875、次のクエリを実行できます:
db.employee.replaceOne(
{
"employee_id": 794875
},
{
"employee_id": 794875,
"employee_name": "David Smith",
"job": "Sales Manager",
"department_id": 3,
"salary": 30000,
"hire_date": NumberLong("1643969311817")
}
);
上記のコマンドは、出力に確認応答JSONを出力します:
{
"acknowledged":true,
"matchedCount":1,
"modifiedCount":1
}
ここでは、 employee_id フィールドは、ドキュメントをフィルタリングするために使用されます。更新クエリの2番目の引数は、既存のドキュメントが置き換えられるドキュメントを示します。
上記のクエリでは、 replaceOneを実行しています。 したがって、1つのドキュメントのみがそのフィルターに置き換えられます。または、すべてのドキュメントをそのフィルタークエリで置き換える場合は、 updateManyを使用する必要があります。 メソッド。