1. 概要

MongoDB は、一般に公開されているドキュメント指向のNoSQLデータベースです。 update replace save などのさまざまな方法を使用して、コレクション内のドキュメントを更新できます。 ドキュメントの特定のフィールドを変更するために、 $ set $ inc、などのさまざまな演算子を使用します。

このチュートリアルでは、updateおよびreplaceクエリを使用してドキュメントの複数のフィールドを変更する方法を学習します。 デモンストレーションの目的で、最初にmongoシェルクエリについて説明し、次にJavaで対応する実装について説明します。

ここで、目的を達成するためのさまざまな方法を調べてみましょう。

2. さまざまなフィールドを更新するためのシェルクエリ

始める前に、まず新しいデータベースbaeldungとサンプルコレクションemployeeを作成しましょう。 すべての例でこのコレクションを使用します。

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演算子を使用してjobを更新します。 ]およびdepartment_idフィールド。

$set演算子と$inc演算子を1つの更新クエリで一緒に使用することもできます。

db.employee.updateOne(
    {
        "employee_id": 794875
    },
    {
        $inc: {
            department_id: 1
        },
        $set: {
            job: "Sales Manager"
        }
    }
);

これにより、 jobフィールドがSalesManagerに更新され、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.BasicDBObjectorg.bson.Document。をサポートします。資料。

先に進む前に、まず baeldungDB内のemployeeコレクションに接続しましょう。

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は、utilパッケージにあるLinkedHashMapクラスから継承されます。

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);

ここでは、まず、に基づいてフィルタークエリを作成しました。 従業員ID。 この操作により、一連のドキュメントが返されます。 さらに、設定されたクエリに従って、department_idjobの値を更新しました。

3.2. bsonドキュメントの使用

bson ドキュメントを使用して、すべてのMongoDB操作を実行できます。 そのためには、まずコレクションオブジェクトが必要であり、次にupdateManyメソッドとfilterおよびset関数を使用して更新操作を実行します。

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」と一致させます。 次に、set演算子を使用してdepartment_idjobを更新します。

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メソッドを使用する必要があります。

5. 結論

この記事では、MongoDBでドキュメントの複数のフィールドを更新するさまざまな方法について説明しました。 MongoDBシェルを使用する実装とJavaドライバーを使用する実装の2つについて広く説明しました。

$incおよび$set 演算子を含む、ドキュメントの複数のフィールドを更新するためのさまざまなオプションがあります。

これらすべての例とコードスニペットの実装は、GitHubにあります。