1。概要
Upsertは、挿入と更新を組み合わせたものです(inSERT + UPdate =upsert)。 アップサートを使用できます さまざまな更新方法、つまり update 、 findAndModify 、および replaceOne 。
ここMongoDBでは、アップサート オプションはブール値です 価値。値がtrueであるとします。 ドキュメントは指定されたクエリフィルターと一致します。その場合、適用された更新操作によってドキュメントが更新されます。値がtrueの場合 条件に一致するドキュメントがない場合、このオプションは新しいドキュメントをコレクションに挿入します。新しいドキュメントには、フィルターと適用された操作に基づくフィールドが含まれます。
このチュートリアルでは、最初にアップサートを見ていきます。 MongoDB Shellクエリで、Javaドライバーコードを使用します。
2。データベースの初期化
アップサートを実行する前に 操作では、最初に新しいデータベースを設定する必要があります baeldung およびサンプルコレクション、車両 :
db.vehicle.insertMany([
{
"companyName":"Nissan",
"modelName":"GTR",
"launchYear":2016,
"type":"Sports",
"registeredNo":"EPS 5561"
},
{
"companyName":"BMW",
"modelName":"X5",
"launchYear":2020,
"type":"SUV",
"registeredNo":"LLS 6899"
},
{
"companyName":"Honda",
"modelName":"Gold Wing",
"launchYear":2018,
"type":"Bike",
"registeredNo":"LKS 2477"
}]);
挿入が成功した場合、上記のコマンドは以下に示すようなJSONを出力します。
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("623c1db39d55d4e137e4781b"),
ObjectId("623c1db39d55d4e137e4781c"),
ObjectId("623c1db39d55d4e137e4781d")
]
}
ダミーデータをコレクション車両に正常に追加しました 。
3。 更新を使用する 方法
このセクションでは、アップサートの使用方法を学習します。 updateのオプション 方法。 アップサートの主な目的 オプションは、適用されたフィルターに基づいて既存のドキュメントを更新するか、フィルターが一致しない場合は新しいドキュメントを挿入することです 。
例として、 $ setOnInsertを使用します upsertを使用する演算子 ドキュメントに新しいフィールドを挿入する際に追加の利点を得るオプション。
フィルタ条件がコレクションの既存のドキュメントと一致するクエリを確認してみましょう。
db.vehicle.update(
{
"modelName":"X5"
},
{
"$set":{
"companyName":"Hero Honda"
}
},
{
"upsert":true
});
上記のクエリは次のドキュメントを返します:
{
"nMatched" : 1,
"nUpserted" : 0,
"nModified" : 1
}
ここでは、上記のmongoシェルクエリに対応するJavaドライバーコードを確認します。
UpdateOptions options = new UpdateOptions().upsert(true);
UpdateResult updateResult = collection.updateOne(Filters.eq("modelName", "X5"),
Updates.combine(Updates.set("companyName", "Hero Honda")), options);
System.out.println("updateResult:- " + updateResult);
上記のクエリでは、フィールド modelName 「X5」はコレクションにすでに存在するため、フィールド companyName そのドキュメントのは「ヒーローホンダ」に更新されます。
それでは、アップサートの例を見てみましょう。 $ setOnInsertを使用するオプション オペレーター。新しいドキュメントを追加する場合にのみ適用されます:
db.vehicle.update(
{
"modelName":"GTPR"
},
{
"$set":{
"companyName":"Hero Honda"
},
"$setOnInsert":{
"launchYear" : 2022,
"type" : "Bike",
"registeredNo" : "EPS 5562"
},
},
{
"upsert":true
});
上記のクエリは次のドキュメントを返します:
{
"nMatched" : 0,
"nUpserted" : 1,
"nModified" : 0,
"_id" : ObjectId("623b378ed648af670fe50e7f")
}
$ setOnInsertを使用した上記の更新クエリのJavaドライバーコード オプションは次のようになります:
UpdateResult updateSetOnInsertResult = collection.updateOne(Filters.eq("modelName", "GTPR"),
Updates.combine(Updates.set("companyName", "Hero Honda"),
Updates.setOnInsert("launchYear", 2022),
Updates.setOnInsert("type", "Bike"),
Updates.setOnInsert("registeredNo", "EPS 5562")), options);
System.out.println("updateSetOnInsertResult:- " + updateSetOnInsertResult);
ここで、上記のクエリでは、フィールド modelNameのフィルタ条件 「GTPR」はどのコレクションドキュメントとも一致しないため、コレクションに新しいドキュメントを追加します。 注意すべき重要な点は、 $ setOnInsert すべてのフィールドを新しいドキュメントに追加します。
4。 findAndModifyの使用 方法
upsertを使用することもできます findAndModifyを使用するオプション 方法。このメソッドの場合、 upsertのデフォルト値 オプションはfalse 。 アップサートを設定した場合 trueのオプション 、更新方法とまったく同じように実行されます。
findAndModifyのユースケースを確認してみましょう upsertを使用したメソッド オプションtrue :
db.vehicle.findAndModify(
{
query:{
"modelName":"X7"
},
update: {
"$set":{
"companyName":"Hero Honda"
}
},
"upsert":true,
"new":true
});
この場合、上記のクエリは新しく作成されたドキュメントを返します。上記のクエリのJavaドライバコードを確認してみましょう:
FindOneAndUpdateOptions upsertOptions = new FindOneAndUpdateOptions();
upsertOptions.returnDocument(ReturnDocument.AFTER);
upsertOptions.upsert(true);
Document resultDocument = collection.findOneAndUpdate(Filters.eq("modelName", "X7"),
Updates.set("companyName", "Hero Honda"), upsertOptions);
System.out.println("resultDocument:- " + resultDocument);
ここでは、最初にフィルター条件を作成し、それに基づいて、既存のドキュメントを更新するか、コレクションに新しいドキュメントを追加します Vehicle 。
5。 replaceOneの使用 方法
アップサートを実行してみましょう replaceOneを使用した操作 方法。 replaceOne MongoDBのメソッドは、条件が一致した場合、コレクション内の単一のドキュメントを置き換えるだけです。
まず、replaceメソッドのMongoシェルクエリを調べてみましょう:
db.vehicle.replaceOne(
{
"modelName":"GTPR"
},
{
"modelName" : "GTPR",
"companyName" : "Hero Honda",
"launchYear" : 2022,
"type" : "Bike",
"registeredNo" : "EPS 5562"
},
{
"upsert":true
});
上記のクエリは次の応答を返します:
{
"acknowledged" : true,
"matchedCount" : 1,
"modifiedCount" : 1
}
それでは、Javaドライバーコードを使用して上記のクエリを記述しましょう。
Document replaceDocument = new Document();
replaceDocument.append("modelName", "GTPP")
.append("companyName", "Hero Honda")
.append("launchYear", 2022)
.append("type", "Bike")
.append("registeredNo", "EPS 5562");
UpdateResult updateReplaceResult = collection.replaceOne(Filters.eq("modelName", "GTPP"), replaceDocument, options);
System.out.println("updateReplaceResult:- " + updateReplaceResult);
ここで、この場合、最初に、既存のドキュメントを置き換える新しいドキュメントを作成し、 upsertを使用する必要があります。 オプションtrue 、条件が一致した場合にのみドキュメントを置き換えます。