sql >> データベース >  >> NoSQL >> MongoDB

同じMongoDBアップデートでのプッシュとセットの操作

    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”


    1. BadValue無効であるか、ユーザーロケールが設定されていません。 LANGおよび/またはLC_*環境変数が正しく設定されていることを確認してください

    2. redisでのAOFおよびRDBバックアップ

    3. Redisを使用したマルチパラメーターマッチファインダー

    4. どうすればFlaskでMongoDBを使用できますか?