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

MongoDBのドキュメントを更新する

    1。概要

    MongoDBは、C ++で記述された、クロスプラットフォームのドキュメント指向のオープンソースNoSQLデータベースです。さらに、MongoDBは、高性能、高可用性、および自動スケーリングを提供します。

    MongoDBのドキュメントを更新するために、 updateOneなどのさまざまな方法を使用できます。 、 findOneAndUpdate、 さらに、MongoDBは、更新メソッドのさまざまな演算子を提供します。

    このチュートリアルでは、MongoDBで更新操作を実行するためのさまざまなアプローチについて説明します。それぞれのアプローチについて、最初にmongoシェルクエリについて説明し、次にJavaでの実装について説明します。

    2。データベースのセットアップ

    更新クエリに進む前に、まずデータベース baeldungを作成しましょう。 、およびサンプルコレクション、学生:

    use baeldung;
    db.createCollection(student);

    例として、コレクション studentにいくつかのドキュメントを追加しましょう。 insertManyを使用する クエリ:

    db.student.insertMany([
        {
            "student_id": 8764,
            "student_name": "Paul Starc",
            "address": "Hostel 1",
            "age": 16,
            "roll_no":199406
        },
        {
            "student_id": 8765,
            "student_name": "Andrew Boult",
            "address": "Hostel 2",
            "age": 18,
            "roll_no":199408
        }
    ]);

    挿入が成功すると、acknowledged:trueのJSONが取得されます :

    {
        "acknowledged" : true,
        "insertedIds" : [
            ObjectId("621b078485e943405d04b557"),
    	ObjectId("621b078485e943405d04b558")
        ]
    }

    それでは、MongoDBのドキュメントを更新するさまざまな方法について詳しく見ていきましょう。

    3。 updateOneの使用 方法

    MongoDBでの更新操作は、新しいフィールドを追加するか、フィールドを削除するか、既存のフィールドを更新することで実行できます。 updateOne メソッドは、適用されたクエリフィルターに基づいてコレクション内の単一のドキュメントを更新します。最初にフィルターに一致するドキュメントを検索し、次に指定されたフィールドを更新します。

    さらに、 $ setなどのさまざまな演算子を使用できます 、 $ unset $ inc 、など、更新方法を使用します。

    実例を示すために、コレクションの単一のドキュメントを更新するクエリを調べてみましょう。

    db.student.updateOne(
        { 
            "student_name" : "Paul Starc"
        },
        { 
            $set: {
                "address" : "Hostel 2"
            }
        }
     );

    以下に示すような出力が得られます:

    {
        "acknowledged":true,
        "matchedCount":1,
        "modifiedCount":1
    }

    上記のupdateOneのJavaドライバーコードを確認してみましょう。 クエリ:

    UpdateResult updateResult = collection.updateOne(Filters.eq("student_name", "Paul Starc"),
    Updates.set("address", "Hostel 2"));

    ここでは、最初に student_nameを使用しました ドキュメントをフィルタリングするフィールド。次に、ドキュメントのアドレスを student_nameで更新します。 「ポールスターク」。

    4。 updateManyの使用 方法

    updateMany メソッドは、指定されたフィルターに一致するMongoDBコレクション内のすべてのドキュメントを更新します。 updateManyを使用する利点の1つ 古いドキュメントのフィールドを失うことなく、複数のドキュメントを更新できるということです。

    updateManyを使用してMongoDBシェルクエリを見てみましょう 方法:

    db.student.updateMany(
        { 
            age: { 
                $lt: 20
             } 
        },
        { 
            $set:{ 
                "Review" : true 
            }
        }
    );

    上記のコマンドは、次の出力を返します。

    {
        "acknowledged":true,
        "matchedCount":2,
        "modifiedCount":2
    }

    ここでは、 matchedCount 一致したドキュメントの数が含まれますが、 ModifiedCount 変更されたドキュメント番号が含まれています。

    updateManyを使用してJavaドライバコードを調べてみましょう。 方法:

    UpdateResult updateResult = collection.updateMany(Filters.lt("age", 20), Updates.set("Review", true));

    ここでは、年齢のすべてのドキュメント 20未満がフィルタリングされ、レビュー フィールドはtrueに設定されます 。

    5。 replaceOneの使用 方法

    replaceOne MongoDBのメソッドは、ドキュメント全体を置き換えます。 replaceOneの欠点の1つ つまり、古いフィールドはすべて新しいフィールドに置き換えられ、古いフィールドも失われます。

    db.student.replaceOne(
        { 
            "student_id": 8764
        },
        {
            "student_id": 8764,
            "student_name": "Paul Starc",
            "address": "Hostel 2",
            "age": 18,
            "roll_no":199406
        }
    );

    この場合、次の出力が得られます:

    {
        "acknowledged":true,
        "matchedCount":1,
        "modifiedCount":1
    }

    一致するものが見つからない場合、操作は matchedCountを返します。 0として:

    {
        "acknowledged":true,
        "matchedCount":0,
        "modifiedCount":0
    }

    replaceOne を使用して、対応するJavaドライバーコードを記述しましょう。 方法:

    Document replaceDocument = new Document();
    replaceDocument
      .append("student_id", 8764)
      .append("student_name", "Paul Starc")
      .append("address", "Hostel 2")
      .append("age",18)
      .append("roll_no", 199406);
    UpdateResult updateResult = collection.replaceOne(Filters.eq("student_id", 8764), replaceDocument);

    上記のコードでは、古いドキュメントを置き換えるドキュメントを作成しました。 student_idのドキュメント 8764は、新しく作成されたドキュメントに置き換えられます。

    6。 findOneAndReplaceの使用 方法

    findOneAndReplace メソッドは、MongoDBによって提供される高度な更新メソッドの1つであり、指定された選択基準に基づいて最初に一致したドキュメントを置き換えます。デフォルトでは、このメソッドは元のドキュメントを返します。 findOneAndReplaceのさまざまなオプションを使用できます 必要に応じてドキュメントを並べ替えて投影します。

    つまり、 findOneAndReplace 適用されたフィルターに基づいて、コレクションの最初の一致するドキュメントを置き換えます:

    db.student.findOneAndReplace(
        { 
            "student_id" : { 
                $eq : 8764 
            }
        },
        { 
            "student_id" : 8764,
            "student_name" : "Paul Starc",
            "address": "Hostel 2",
            "age": 18,
            "roll_no":199406 
        },
        {
            returnNewDocument: false
        }
    );

    このクエリは次のドキュメントを返します:

    {
        "student_id":8764,
        "student_name":"Paul Starc",
        "address":"Hostel 1",
        "age":16,
        "roll_no":199406
    }

    returnNewDocumentを設定した場合 true 、操作は代わりに置き換えられたドキュメントを返します:

    {
        "student_id":8764,
        "student_name":"Paul Starc",
        "address":"Hostel 2",
        "age":18,
        "roll_no":199406
    }

    findOneAndReplaceを使用してみましょう student_idを投影するメソッド および年齢 返されたドキュメントのフィールド:

    db.student.findOneAndReplace(
        { 
            "student_id" : {
            $eq : 8764 
            } 
        },
        { 
            "student_id" : 8764, 
            "student_name" : "Paul Starc",
            "address": "Hostel 2",
            "age": 18,
            "roll_no":199406 
        },
        { 
            projection: { 
                "_id" : 0,
                "student_id":1,
                "age" : 1 
            } 
        }
    );

    上記のクエリの出力には、投影されたフィールドのみが含まれます:

    {
        "student_id":"8764",
        "age":16
    }

    findOneAndReplace:のさまざまなオプションを使用した上記のクエリのJavaドライバコード

    Document replaceDocument = new Document();
    replaceDocument
      .append("student_id", 8764)
      .append("student_name", "Paul Starc")
      .append("address", "Hostel 2")
      .append("age", 18)
      .append("roll_no", 199406);
    Document sort = new Document("roll_no", 1);
    Document projection = new Document("_id", 0).append("student_id", 1).append("address", 1);
    Document resultDocument = collection.findOneAndReplace(
      Filters.eq("student_id", 8764), 
      replaceDocument,
      new FindOneAndReplaceOptions().upsert(true).sort(sort).projection(projection).returnDocument(ReturnDocument.AFTER));
    

    上記のクエリでは、 findOneAndReplace メソッドは、最初に roll_no、に基づいてドキュメントを昇順で並べ替えます。 新しく作成されたドキュメントは、ドキュメントを student_idに置き換えます。 「8764」。

    7。 findOneAndUpdateの使用 方法

    findOneAndUpdate メソッドは、コレクション内で最初に一致したドキュメントを更新します。複数のドキュメントが選択基準に一致する場合、最初に一致したドキュメントのみが更新されます。ドキュメントを更新すると、 _idの値が フィールドは変更されません:

    db.student.findOneAndUpdate(
        { 
            "student_id" : 8764
        },
        { 
            $inc : { 
                "roll_no" : 5
            } 
        },
        { 
            sort: { 
                "roll_no" : 1 
            }, 
            projection: { 
                "_id" : 0,
                "student_id":1,
                "address" : 1
            }
        }
    );
    

    クエリの出力には、 studentIdのみが含まれます。 およびアドレス 古いドキュメントの:

    {
        "student_id":8764,
        "address":"Hostel 1"
    }
    

    findOneAndUpdate のさまざまなオプションを使用した、上記のクエリのJavaドライバコード 次のとおりです

    Document sort = new Document("roll_no", 1);
    Document projection = new Document("_id", 0).append("student_id", 1).append("address", 1);
    Document resultDocument = collection.findOneAndUpdate(
      Filters.eq("student_id", 8764),
      Updates.inc("roll_no", 5), 
      new FindOneAndUpdateOptions().sort(sort).projection(projection).returnDocument(ReturnDocument.BEFORE));

    この場合、 findOneAndUpdate メソッドは、最初に roll_noに基づいて昇順でドキュメントを並べ替えます 。上記のクエリは、 roll_noをインクリメントします 5で、 student_idを返します およびアドレス フィールド。


    1. mongodbで段落を保存/表示するにはどうすればよいですか?

    2. 参照モデルのフィールドごとのモデルに対するマングースのネストされたクエリ

    3. Javaドライバーを介してAtlasM0(無料利用枠)クラスターに正しく接続するにはどうすればよいですか?

    4. EM ::Synchrony#syncを簡単に使用すると、「ルートファイバー」FiberErrorが発生します-私のせいですか?