1. Przegląd
Upsert to połączenie wstawiania i aktualizacji (inSERT + UPdate =upsert). Możemy użyć upsert z różnymi metodami aktualizacji, np. aktualizacja , findAndModify i zamień jeden .
Tutaj, w MongoDB, upsert opcja to wartość logiczna wartość. Załóżmy, że wartość jest prawda a dokumenty pasują do określonego filtra zapytania. W takim przypadku zastosowana operacja aktualizacji zaktualizuje dokumenty. Jeśli wartość jest prawda a żadne dokumenty nie spełniają warunku, ta opcja wstawia nowy dokument do kolekcji. Nowy dokument będzie zawierał pola oparte na filtrze i zastosowanych operacjach.
W tym samouczku najpierw przyjrzymy się wstawkom w zapytaniu MongoDB Shell, a następnie użyj kodu sterownika Java.
2. Inicjalizacja bazy danych
Zanim przejdziemy dalej, by wykonać upsert operacji, najpierw musimy skonfigurować nową bazę danych baeldung i zbiór próbek, pojazd :
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"
}]);
W przypadku pomyślnego wstawienia powyższe polecenie spowoduje wydrukowanie JSON podobnego do pokazanego poniżej:
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("623c1db39d55d4e137e4781b"),
ObjectId("623c1db39d55d4e137e4781c"),
ObjectId("623c1db39d55d4e137e4781d")
]
}
Pomyślnie dodaliśmy fałszywe dane do kolekcji pojazdu .
3. Korzystanie z aktualizacji Metoda
W tej sekcji nauczymy się używać wstawek opcja z aktualizacją metoda. Główny cel wstawek opcją jest aktualizacja istniejącego dokumentu na podstawie zastosowanego filtra lub wstawienie nowego dokumentu, jeśli filtr nie uzyska dopasowania .
Jako ilustrację użyjemy $setOnInsert operator z upsert możliwość uzyskania dodatkowej korzyści przy wstawianiu nowych pól do dokumentu.
Sprawdźmy zapytanie, w którym warunek filtra pasuje do istniejącego dokumentu w kolekcji:
db.vehicle.update(
{
"modelName":"X5"
},
{
"$set":{
"companyName":"Hero Honda"
}
},
{
"upsert":true
});
Powyższe zapytanie zwróci następujący dokument:
{
"nMatched" : 1,
"nUpserted" : 0,
"nModified" : 1
}
Tutaj zobaczymy kod sterownika Java odpowiadający powyższemu zapytaniu powłoki mongo:
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);
W powyższym zapytaniu pole modelName „X5” już istnieje w kolekcji, więc pole nazwafirmy tego dokumentu zostanie zaktualizowany do „Hero Honda”.
Zobaczmy teraz przykład upsert opcja za pomocą $setOnInsert operator. Będzie miała zastosowanie tylko w przypadku dodania nowego dokumentu:
db.vehicle.update(
{
"modelName":"GTPR"
},
{
"$set":{
"companyName":"Hero Honda"
},
"$setOnInsert":{
"launchYear" : 2022,
"type" : "Bike",
"registeredNo" : "EPS 5562"
},
},
{
"upsert":true
});
Powyższe zapytanie zwróci następujący dokument:
{
"nMatched" : 0,
"nUpserted" : 1,
"nModified" : 0,
"_id" : ObjectId("623b378ed648af670fe50e7f")
}
Kod sterownika Java powyższego zapytania aktualizującego z $setOnInsert opcją będzie:
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);
Tutaj, w powyższym zapytaniu, warunek filtrowania pola modelName „GTPR” nie pasuje do żadnego dokumentu kolekcji, więc dodamy nowy dokument do kolekcji. Kluczowym punktem, na który należy zwrócić uwagę, jest to, że $setOnInsert dodaje wszystkie pola do nowego dokumentu.
4. Korzystanie z findAndModify Metoda
Możemy również użyć upsert opcja za pomocą findAndModify metoda. W przypadku tej metody domyślna wartość upsert opcja jest fałsz . Jeśli ustawimy upsert opcja prawdy , będzie działać dokładnie tak samo, jak metoda aktualizacji.
Zobaczmy przypadek użycia findAndModify metoda z upsert opcja prawda :
db.vehicle.findAndModify(
{
query:{
"modelName":"X7"
},
update: {
"$set":{
"companyName":"Hero Honda"
}
},
"upsert":true,
"new":true
});
W takim przypadku powyższe zapytanie zwróci nowo utworzony dokument. Sprawdźmy kod sterownika Java powyższego zapytania:
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);
Tutaj najpierw utworzyliśmy warunek filtra i na tej podstawie albo zaktualizujemy istniejący dokument, albo dodamy nowy dokument do kolekcji pojazd .
5. Korzystanie z replaceOne Metoda
Zróbmy wstawkę operacja za pomocą replaceOne metoda. replaceOne metoda MongoDB po prostu zastępuje pojedynczy dokument w kolekcji, jeśli warunek jest zgodny.
Najpierw przyjrzyjmy się zapytaniu powłoki Mongo metody replace:
db.vehicle.replaceOne(
{
"modelName":"GTPR"
},
{
"modelName" : "GTPR",
"companyName" : "Hero Honda",
"launchYear" : 2022,
"type" : "Bike",
"registeredNo" : "EPS 5562"
},
{
"upsert":true
});
Powyższe zapytanie zwróci następującą odpowiedź:
{
"acknowledged" : true,
"matchedCount" : 1,
"modifiedCount" : 1
}
Teraz napiszmy powyższe zapytanie za pomocą kodu sterownika 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);
Tutaj, w tym przypadku, musimy najpierw utworzyć nowy dokument, którym chcemy zastąpić istniejący dokument, i za pomocą upsert opcja prawda , zastąpimy dokument tylko wtedy, gdy warunek zostanie spełniony.