1。概要
$ push 配列に値を追加するMongoDBの更新演算子です。対照的に、 $ set 演算子は、ドキュメント内の既存のフィールドの値を更新するために使用されます。
この短いチュートリアルでは、 $ pushを実行する方法を紹介します。 および$set 単一の更新クエリで一緒に操作します。
2。データベースの初期化
複数の更新操作を実行する前に、まずデータベースを設定する必要があります baeldung およびサンプルコレクションマーク :
use baeldung;
db.createCollection(marks);
コレクションにいくつかのドキュメントを挿入してみましょうマーク insertManyを使用する MongoDBのメソッド:
db.marks.insertMany([
{
"studentId": 1023,
"studentName":"James Broad",
"joiningYear":"2018",
"totalMarks":100,
"subjectDetails":[
{
"subjectId":123,
"subjectName":"Operating Systems Concepts",
"marks":40
},
{
"subjectId":124,
"subjectName":"Numerical Analysis",
"marks":60
}
]
},
{
"studentId": 1024,
"studentName":"Chris Overton",
"joiningYear":"2018",
"totalMarks":110,
"subjectDetails":[
{
"subjectId":123,
"subjectName":"Operating Systems Concepts",
"marks":50
},
{
"subjectId":124,
"subjectName":"Numerical Analysis",
"marks":60
}
]
}
]);
挿入が成功すると、上記のクエリは次の応答を返します。
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("622300cc85e943405d04b567"),
ObjectId("622300cc85e943405d04b568")
]
}
これまでに、いくつかのサンプルドキュメントをコレクションのマークに正常に挿入しました。 。
3。問題を理解する
問題を理解するために、最初に挿入したばかりのドキュメントを理解しましょう。これには、学生の詳細と、さまざまな科目で学生が取得したマークが含まれています。 totalMarks は、さまざまな科目で得られた点数の合計です。
subjectDetailsに新しい件名を追加したい状況を考えてみましょう。 配列。また、データの一貫性を保つために、 totalMarksを更新する必要があります フィールドも同様です。
MongoDBでは、最初に、 $ pushを使用して新しいサブジェクトを配列に追加します オペレーター。次に、 totalMarksを設定します $ setを使用してフィールドを特定の値に変更します オペレーター。
これらの操作は両方とも、 $ pushを使用して個別に実行できます。 および$set それぞれ演算子。ただし、MongoDBクエリを記述して、両方の操作を一緒に実行することはできます。
4。 MongoDBシェルクエリの使用
MongoDBでは、さまざまな更新演算子を使用して、ドキュメントの複数のフィールドを更新できます。ここでは、両方の $ pushを使用します および$set updateOneで一緒に演算子 クエリ。
両方の$pushを含む例を確認してみましょう および$set 一緒に演算子:
db.marks.updateOne(
{
"studentId": 1023
},
{
$set: {
totalMarks: 170
},
$push: {
"subjectDetails":{
"subjectId": 126,
"subjectName": "Java Programming",
"marks": 70
}
}
}
);
ここで、上記のクエリでは、studentIdに基づくフィルタクエリを追加しました。 フィルタリングされたドキュメントを取得したら、 totalMarksを更新します。 $set演算子を使用します。それに加えて、新しいサブジェクトデータを subjectDetailsに挿入します $ pushを使用した配列 オペレーター。
その結果、上記のクエリは次の出力を返します。
{
"acknowledged":true,
"matchedCount":1,
"modifiedCount":1
}
ここで、 matchedCount フィルタに一致したドキュメント数が含まれますが、 ModifiedCount 変更されたドキュメントの数が含まれます。
5。 Javaドライバーコード
これまで、 $ pushを使用するためのmongoシェルクエリについて説明してきました。 および$set 一緒にオペレーター。ここでは、Javaドライバーコードを使用して同じものを実装する方法を学びます。
先に進む前に、まずDBと必要なコレクションに接続しましょう:
MongoClient mongoClient = new MongoClient(new MongoClientURI("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("baeldung");
MongoCollection<Document> collection = database.getCollection("marks");
ここでは、ローカルホストのポートデフォルトポート27017で実行されているMongoDBに接続しています。
次に、Javaドライバーコードを調べてみましょう。
Document subjectData = new Document()
.append("subjectId", 126)
.append("subjectName", "Java Programming")
.append("marks", 70);
UpdateResult updateQueryResult = collection.updateOne(Filters.eq("studentId", 1023),
Updates.combine(Updates.set("totalMarks", 170),
Updates.push("subjectDetails", subjectData)));
このコードスニペットでは、 updateOneを使用しました 適用されたフィルターstudentIdに基づいて単一のドキュメントのみを更新するメソッド 1023.次に、 Updates.combineを使用しました 1回の呼び出しで複数の操作を実行します。フィールドtotalMarks 170に更新され、新しいドキュメント subjectData 配列フィールドにプッシュされます“ subjectDetails” 。