MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Przewodnik po Upsert w MongoDB

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.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongo DB znajdź według nazwy pola z dowolną wartością

  2. Mongo unikalna wielkość liter w indeksie nie jest wrażliwa

  3. Czy mongorestore może przyjąć pojedynczy argument adresu URL zamiast oddzielnych argumentów?

  4. Mongodb Query Aby wybrać rekordy posiadające podany klucz

  5. Odpytywanie MongoDB o dopasowanie w pierwszym elemencie tablicy