MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Anleitung zum Upsert in MongoDB

1. Übersicht

Upsert ist eine Kombination aus Insert und Update (inSERT + UPdate =upsert). Wir können den Upsert verwenden mit unterschiedlichen Update-Methoden, z. B. update , findAndModify , und replaceOne .

Hier in MongoDB der Upsert Option ist ein boolescher Wert Wert. Angenommen, der Wert ist true und die Dokumente mit dem angegebenen Abfragefilter übereinstimmen. In diesem Fall aktualisiert die angewendete Aktualisierungsoperation die Dokumente. Wenn der Wert true ist und kein Dokument der Bedingung entspricht, fügt diese Option ein neues Dokument in die Sammlung ein. Das neue Dokument enthält die Felder basierend auf Filtern und angewendeten Operationen.

In diesem Tutorial sehen wir uns zuerst den Upsert an in der MongoDB-Shell abfragen und dann den Java-Treibercode verwenden.

2. Datenbankinitialisierung

Bevor wir mit dem Upsert fortfahren müssen wir zuerst eine neue Datenbank einrichten baeldung und eine Musterkollektion Fahrzeug :

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

Bei erfolgreicher Einfügung druckt der obige Befehl ein JSON ähnlich dem unten gezeigten:

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

Wir haben die Dummy-Daten erfolgreich in die Sammlung Fahrzeug eingefügt .

3. Mit dem Update Methode

In diesem Abschnitt lernen wir, den Upsert zu verwenden Option mit Aktualisieren Methode. Der Hauptzweck des Upsert Die Option besteht darin, das vorhandene Dokument basierend auf dem angewendeten Filter zu aktualisieren oder ein neues Dokument einzufügen, wenn der Filter keine Übereinstimmung findet .

Zur Veranschaulichung verwenden wir $setOnInsert Operator mit dem upsert Option, um einen zusätzlichen Vorteil beim Einfügen neuer Felder in das Dokument zu erhalten.

Schauen wir uns eine Abfrage an, in der die Filterbedingung mit dem vorhandenen Dokument der Sammlung übereinstimmt:

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

Die obige Abfrage gibt das folgende Dokument zurück:

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

Hier sehen wir den Java-Treibercode, der der obigen Mongo-Shell-Abfrage entspricht:

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 der obigen Abfrage ist das Feld modelName „X5“ existiert bereits in der Sammlung, also das Feld companyName dieses Dokuments wird zu „Hero Honda“ aktualisiert.

Sehen wir uns nun ein Beispiel für upsert an Option mit $setOnInsert Operator. Es gilt nur, wenn ein neues Dokument hinzugefügt wird:

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

Die obige Abfrage gibt das folgende Dokument zurück:

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

Der Java-Treibercode der obigen Update-Abfrage mit dem $setOnInsert Option ist:

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 der obigen Abfrage, die Filterbedingung des Feldes modelName „GTPR“ stimmt mit keinem Sammlungsdokument überein, daher fügen wir der Sammlung ein neues Dokument hinzu. Wichtig ist, dass $setOnInsert fügt alle Felder in das neue Dokument ein.

4. Verwenden von findAndModify Methode

Wir können auch den Upsert verwenden Option mit findAndModify Methode. Für diese Methode der Standardwert des Upsert Option ist false . Wenn wir den upsert setzen Option auf true , verhält es sich genauso wie die Update-Methode.

Schauen wir uns einen Anwendungsfall von findAndModify an Methode mit dem upsert Option true :

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

In diesem Fall gibt die obige Abfrage das neu erstellte Dokument zurück. Schauen wir uns den Java-Treibercode der obigen Abfrage an:

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 haben wir zuerst die Filterbedingung erstellt und basierend darauf aktualisieren wir entweder das vorhandene Dokument oder fügen der Sammlung Fahrzeug ein neues Dokument hinzu .

5. Verwenden von replaceOne Methode

Lassen Sie uns den Upsert ausführen Operation mit replaceOne Methode. Das replaceOne Methode von MongoDB ersetzt nur das einzelne Dokument innerhalb der Sammlung, wenn die Bedingung zutrifft.

Sehen wir uns zunächst die Abfrage der Mongo-Shell der Methode replace an:

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

Die obige Abfrage gibt die folgende Antwort zurück:

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

Lassen Sie uns nun die obige Abfrage mit dem Java-Treibercode schreiben:

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 müssen wir in diesem Fall zuerst ein neues Dokument erstellen, durch das wir das vorhandene Dokument ersetzen wollen, und mit dem Upsert Option true , ersetzen wir das Dokument nur, wenn die Bedingung erfüllt wird.