sql >> Database >  >> NoSQL >> MongoDB

Gids voor Upsert in MongoDB

1. Overzicht

Upsert is een combinatie van insert en update (inSERT + UPdate =upsert). We kunnen de upsert . gebruiken met verschillende updatemethoden, d.w.z. update , findAndModify , en replaceOne .

Hier in MongoDB, de upsert optie is een Boolean waarde. Stel dat de waarde waar is en de documenten komen overeen met het opgegeven queryfilter. In dat geval zal de toegepaste update-bewerking de documenten bijwerken. Als de waarde waar is en geen documenten voldoen aan de voorwaarde, voegt deze optie een nieuw document in de collectie in. Het nieuwe document bevat de velden op basis van filter en toegepaste bewerkingen.

In deze zelfstudie kijken we eerst naar de upsert in MongoDB Shell-query en gebruik vervolgens de Java-stuurprogrammacode.

2. Database-initialisatie

Voordat we verder gaan met het uitvoeren van de upsert operaties, moeten we eerst een nieuwe database opzetten baeldung en een voorbeeldverzameling, voertuig :

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

In het geval van een succesvolle invoeging, zal de bovenstaande opdracht een JSON afdrukken die lijkt op de onderstaande:

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

We hebben de dummy-gegevens met succes toegevoegd aan de verzameling voertuig .

3. De update gebruiken Methode

In dit gedeelte leren we de upsert . te gebruiken optie met de update methode. Het hoofddoel van de upsert optie is om het bestaande document bij te werken op basis van het toegepaste filter of een nieuw document in te voegen als het filter niet overeenkomt .

Ter illustratie gebruiken we de $setOnInsert operator met de upsert optie om een ​​extra voordeel te krijgen bij het invoegen van nieuwe velden in het document.

Laten we eens kijken naar een query waarin de filtervoorwaarde overeenkomt met het bestaande document van de verzameling:

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

De bovenstaande vraag levert het volgende document op:

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

Hier zien we de Java-stuurprogrammacode die overeenkomt met de bovenstaande mongo-shellquery:

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

In de bovenstaande query is het veld modelName “X5” bestaat al in de collectie, dus het veld companyName van dat document wordt geüpdatet naar "Hero Honda".

Laten we nu eens kijken naar een voorbeeld van upsert optie met behulp van de $setOnInsert exploitant. Het is alleen van toepassing in het geval van het toevoegen van een nieuw document:

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

De bovenstaande vraag levert het volgende document op:

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

De Java-stuurprogrammacode van de bovenstaande update-query met de $setOnInsert optie zal zijn:

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

Hier, in de bovenstaande query, de filtervoorwaarde van veld modelName “GTPR” komt met geen enkel incassodocument overeen, dus we zullen een nieuw document aan de collectie toevoegen. Het belangrijkste om op te merken is dat de $setOnInsert voegt alle velden toe aan het nieuwe document.

4. De findAndModify . gebruiken Methode

We kunnen ook de upsert . gebruiken optie met behulp van de findAndModify methode. Voor deze methode is de standaardwaarde van de upsert optie is false . Als we de upsert . instellen optie tot true , het werkt precies hetzelfde als de updatemethode.

Laten we eens kijken naar een gebruiksvoorbeeld van de findAndModify methode met de upsert optie true :

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

In dit geval retourneert de bovenstaande query het nieuw gemaakte document. Laten we eens kijken naar de Java-stuurprogrammacode van de bovenstaande vraag:

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

Hier hebben we eerst de filtervoorwaarde gemaakt en op basis daarvan werken we het bestaande document bij of voegen we een nieuw document toe aan de verzameling voertuig .

5. De replaceOne . gebruiken Methode

Laten we de upsert . uitvoeren bediening met behulp van de replaceOne methode. De replaceOne methode van MongoDB vervangt alleen het enkele document binnen de collectie als de voorwaarde overeenkomt.

Laten we eerst eens kijken naar de Mongo-shellquery van de vervangmethode:

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

De bovenstaande vraag geeft het volgende antwoord:

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

Laten we nu de bovenstaande vraag schrijven met behulp van de Java-stuurprogrammacode:

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

Hier, in dit geval, moeten we eerst een nieuw document maken waarmee we het bestaande document willen vervangen, en met de upsert optie true , vervangen we het document alleen als de voorwaarde overeenkomt.


  1. $unionWith - MongoDB's equivalent van UNION ALL

  2. waarom neemt het geheugengebruik van redis niet af wanneer de helft van de toetsen wordt verwijderd?

  3. Hoe update je meerdere velden met Update.Set in MongoDB met behulp van de officiële c#-driver?

  4. MongoDB - afsluiten met code:62