sql >> Databáze >  >> NoSQL >> MongoDB

Průvodce Upsert v MongoDB

1. Přehled

Upsert je kombinace vložení a aktualizace (inSERT + UPdate =upsert). Můžeme použít upsert s různými metodami aktualizace, tj. aktualizací , findAndModify a replaceOne .

Zde v MongoDB, upsert možnost je Boolean hodnota. Předpokládejme, že hodnota je true a dokumenty odpovídají zadanému filtru dotazu. V takovém případě provede operace aktualizace dokumenty. Pokud je hodnota true a podmínce neodpovídají žádné dokumenty, tato volba vloží do sbírky nový dokument. Nový dokument bude obsahovat pole založená na filtru a použitých operacích.

V tomto tutoriálu se nejprve podíváme na upsert v dotazu MongoDB Shell a poté použijte kód ovladače Java.

2. Inicializace databáze

Než přejdeme k provedení upsert operace, nejprve musíme nastavit novou databázi baeldung a ukázkovou kolekci, vozidlo :

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"
}]);

V případě úspěšného vložení vypíše výše uvedený příkaz JSON podobný tomu, který je zobrazen níže:

{
    "acknowledged" : true, 
    "insertedIds" : [
        ObjectId("623c1db39d55d4e137e4781b"),
	ObjectId("623c1db39d55d4e137e4781c"),
	ObjectId("623c1db39d55d4e137e4781d")
    ]
}

Úspěšně jsme přidali figuríny do kolekce vozidla .

3. Pomocí aktualizace Metoda

V této části se naučíme používat upsert možnost s aktualizací metoda. Hlavní účel upsert možnost je aktualizovat stávající dokument na základě použitého filtru nebo vložit nový dokument, pokud filtr nezíská shodu .

Jako příklad použijeme $setOnInsert operátor s upsert možnost získat další výhodu při vkládání nových polí do dokumentu.

Pojďme se podívat na dotaz, ve kterém podmínka filtru odpovídá existujícímu dokumentu kolekce:

db.vehicle.update(
{
    "modelName":"X5"
},
{
    "$set":{
        "companyName":"Hero Honda"
    }
},
{
    "upsert":true
});

Výše uvedený dotaz vrátí následující dokument:

{ 
    "nMatched" : 1, 
    "nUpserted" : 0,
    "nModified" : 1 
}

Zde uvidíme kód ovladače Java odpovídající výše uvedenému dotazu mongo shell:

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

Ve výše uvedeném dotazu pole modelName „X5“ již v kolekci existuje, takže pole companyName tohoto dokumentu bude aktualizován na „Hero Honda“.

Nyní se podívejme na příklad upsert pomocí možnosti $setOnInsert operátor. Bude použitelné pouze v případě přidání nového dokumentu:

db.vehicle.update(
{
    "modelName":"GTPR"
},
{
    "$set":{
        "companyName":"Hero Honda"
    },
    "$setOnInsert":{
        "launchYear" : 2022,
	"type" : "Bike",
	"registeredNo" : "EPS 5562"
    },  
},
{
    "upsert":true
});

Výše uvedený dotaz vrátí následující dokument:

{
    "nMatched" : 0,
    "nUpserted" : 1,
    "nModified" : 0,
    "_id" : ObjectId("623b378ed648af670fe50e7f")
}

Kód ovladače Java z výše uvedeného aktualizačního dotazu s $setOnInsert možnost bude:

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

Zde, ve výše uvedeném dotazu, podmínka filtru pole modelName „GTPR“ neodpovídá žádnému sbírkovému dokumentu, proto do sbírky přidáme nový dokument. Klíčovým bodem, který je třeba poznamenat, je $setOnInsert přidá všechna pole do nového dokumentu.

4. Pomocí findAndModify Metoda

Můžeme také použít upsert pomocí možnosti findAndModify metoda. U této metody je výchozí hodnotou upsert možnost je false . Pokud nastavíme upsert možnost pravda , bude fungovat přesně stejně jako metoda aktualizace.

Pojďme se podívat na případ použití findAndModify metodou upsert možnost pravda :

db.vehicle.findAndModify(
{
    query:{
        "modelName":"X7"
    },
    update: {
        "$set":{
            "companyName":"Hero Honda"
        }
    },
    "upsert":true,
    "new":true
});

V tomto případě výše uvedený dotaz vrátí nově vytvořený dokument. Pojďme se podívat na kód ovladače Java ve výše uvedeném dotazu:

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

Zde jsme nejprve vytvořili podmínku filtru a na základě toho buď aktualizujeme stávající dokument, nebo přidáme nový dokument do kolekce vozidlo .

5. Pomocí replaceOne Metoda

Proveďme upsert operace pomocí replaceOne metoda. replaceOne metoda MongoDB pouze nahradí jeden dokument v kolekci, pokud podmínka odpovídá.

Nejprve se podívejme na dotaz prostředí Mongo metody nahrazení:

db.vehicle.replaceOne(
{
    "modelName":"GTPR"
},
{
    "modelName" : "GTPR",
    "companyName" : "Hero Honda",
    "launchYear" : 2022,
    "type" : "Bike",
    "registeredNo" : "EPS 5562"
},
{
    "upsert":true
});

Výše uvedený dotaz vrátí následující odpověď:

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

Nyní napišme výše uvedený dotaz pomocí kódu ovladače 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);

Zde v tomto případě musíme nejprve vytvořit nový dokument, kterým chceme stávající dokument nahradit, a s upsert možnost pravda , dokument nahradíme pouze v případě, že bude splněna podmínka.


  1. vlastní ověření mongoose pomocí 2 polí

  2. Pokud je Redis single Threaded, jak může být tak rychlý?

  3. Průvodce dotazy v Spring Data MongoDB

  4. Bitva o databáze NoSQL - Porovnání MongoDB a CouchDB