Tutorials  /  Databases

MongoDB findAndModify() Beispiel

Ccentron Redaktion · März 2024 ·6 Min. Lesezeit ·Databases, Tutorial

Die Methode MongoDB findAndModify() modifiziert und gibt ein einzelnes Dokument zurück, basierend auf den eingegebenen Auswahlkriterien. Standardmäßig zeigt das zurückgegebene Dokument nicht den aktualisierten Inhalt an. Wenn die Datensätze, die den Kriterien entsprechen, nicht in der Datenbank existieren, wird ein neuer Datensatz eingefügt, wenn upsert auf true gesetzt ist.

MongoDB findAndModify()

Die Syntax für die Methode mongodb findAndModify ist wie folgt.

Mongodb
db.collection.findAndModify({
        query: <document>,
        sort: <document>,
        new: <boolean>,
        fields: <document>,
        upsert: <boolean>
})

Die Beschreibung der Parameter ist wie folgt. query: Definiert die Auswahlkriterien, nach denen ein Datensatz modifiziert werden muss. sort: Bestimmt, welches Dokument modifiziert werden soll, wenn die Auswahlkriterien mehrere Dokumente abrufen. new: gibt an, dass das modifizierte Dokument angezeigt wird. fields: gibt die Menge der zurückzugebenden Felder an. upsert: erstellt ein neues Dokument, wenn die Auswahlkriterien kein Dokument abrufen.

DB

Passende Infrastruktur bei centron

Datenbanken im Betrieb wollen gepflegt werden: centron übernimmt auf Wunsch Updates, Backups und Monitoring – von der einzelnen Instanz bis zum Cluster. Managed Cluster ansehen →

Wichtige Punkte zu MongoDB findAndModify

Einige Dinge, die man beim Verwenden der findAndModify MongoDB-Aufrufe beachten sollte, sind:

  • Wenn die eingegebenen Auswahlkriterien kein Dokument abrufen und upsert auf true gesetzt ist, werden die angegebenen Werte eingefügt und ein neues Dokument wird erstellt.
  • Wenn die eingegebenen Auswahlkriterien kein Dokument beim Ausführen von Update- oder Remove-Operationen abrufen, wird null zurückgegeben.
  • Wenn die Option new auf false gesetzt ist und keine Sortieroperation angegeben ist, wird null zurückgegeben.
  • Wenn die Option new auf false gesetzt ist und eine Sortieroperation angegeben ist, ist die Ausgabe leer.

Beispiel für MongoDB findAndModify

Lassen Sie uns nun einige Beispiele sehen, die die Verwendung der findAndModify API demonstrieren. Zuerst erstellen wir einige Testdaten. Wir werden ein neues Auto-Dokument mit den Feldern Name, Farbe, Autonummer (cno), Geschwindigkeit und Herstellungsland (mfdcountry) über die Mongo-Konsole erstellen.

Mongodb
db.car.insert(
    [
    { _id: 1, name: "Alto", color: "Red",cno: "H410",speed:40,mfdcountry: "India"},
    { _id: 2, name: "Polo", color: "White",cno: "H411",speed:45,mfdcountry: "Japan" },
    { _id: 3, name: "Audi", color: "Black",cno: "H412",speed:50,mfdcountry: "Germany" }
    ]
    )

Lassen Sie uns nun überprüfen, dass die Daten tatsächlich mit mongodb find eingefügt wurden:

Mongodb
db.car.find()
{ "_id" : 1, "name" : "Alto", "color" : "Red", "cno" : "H410", "speed" : 40, "mfdcountry" : "India" }
{ "_id" : 2, "name" : "Polo", "color" : "White", "cno" : "H411", "speed" : 45, "mfdcountry" : "Japan" }
{ "_id" : 3, "name" : "Audi", "color" : "Black", "cno" : "H412", "speed" : 50, "mfdcountry" : "Germany" }

Um zur eigentlichen Verwendung von find and modify überzugehen, stellen wir verschiedene Möglichkeiten dar. Fall 1: Das Dokument existiert in der Datenbank

Mongodb
db.car.findAndModify({
    query: { name: "Alto" },
    sort: { cno: 1 },
    update: { $inc: { speed: 10 } },
    })
  1. Die Abfrage findet ein Dokument in der Autosammlung, bei dem das Feld name den Wert Alto hat.
  2. Die Sortierung ordnet die Ergebnisse der Abfrage in aufsteigender Reihenfolge. Wenn mehrere Dokumente die Abfragebedingung erfüllen, wählt die Methode zur Modifikation das erste Dokument gemäß dieser Sortierung aus.
  3. Das Update erhöht den Wert des Geschwindigkeitsfeldes um 10.
  4. Die Methode gibt das ursprünglich ausgewählte Dokument für dieses Update zurück:

Output

Code
{
"_id" : 1,
"name" : "Alto",
"color" : "Red",
"cno" : "H410",
"speed" : 40,
"mfdcountry" : "India"
}

Fall 2: Die Option new ist auf true gesetzt (gibt das aktualisierte Datenset zurück)

Mongodb
db.car.findAndModify({
query: { name: "HondaCity", color: "Silver", cno:"H415" ,speed: 25 },
sort: { cno: 1 },
update: { $inc: { speed: 20 } },
upsert: true,
new: true
})

Output

Code
{
"_id" : ObjectId("546c9f347256eabc40c9da1c"),
"cno" : "H415",
"color" : "Silver",
"name" : "HondaCity",
"speed" : 45
}

Beachten Sie, dass die Geschwindigkeit als 45 angezeigt wird, was der aktualisierte Wert ist, da wir new auf true gesetzt haben. Wenn dies nicht gesetzt ist, wird das Geschwindigkeitsfeld als 20 angezeigt, der alte Wert, obwohl es in der Datenbank aktualisiert wird. Fall 3: Upsert ist auf true gesetzt

Mongodb
db.car.findAndModify({
query: { name: "WagonR" },
sort: { cno: 1 },
update: { $inc: { speed: 5 } },
upsert: true
})

Output:

Mongodb
db.car.find();
{ "_id" : 1, "name" : "Alto", "color" : "Red", "cno" : "H410", "speed" : 50, "mfdcountry" : "India" }
{ "_id" : 2, "name" : "Polo", "color" : "White", "cno" : "H411", "speed" : 45, "mfdcountry" : "Japan" }
{ "_id" : 3, "name" : "Audi", "color" : "Black", "cno" : "H412", "speed" : 50, "mfdcountry" : "Germany" }
{ "_id" : ObjectId("546c7c7d6be0faf69ee36546"), "name" : "WagonR", "speed" : 5 }

Der Autoname mit WagonR ist nicht in der db, daher wird ein neues Dokument in der Datenbank erstellt. Die Methode gibt ein leeres Dokument {} zurück, wenn die Sortieroption angegeben ist. Wenn keine Sortieroption enthalten ist, gibt die Methode null zurück. Abgesehen davon kann dies auch für eine Sortier- und Entfernungsoperation verwendet werden. Wenn das Feld remove auf true gesetzt ist, wird der Autoname mit den angegebenen Kriterien aus der Datenbank entfernt.

Mongodb
db.car.findAndModify(
{
query: { name: "Alto" },
sort: { cno: 1 },
remove: true
}
)

Output:

Code
{
"_id" : 1,
"name" : "Alto",
"color" : "Red",
"cno" : "H410",
"speed" : 50,
"mfdcountry" : "India"
}

Wenn das Feld remove auf true gesetzt ist, wird das Dokument mit dem Namen „Alto“ aus der Datenbank gelöscht.

MongoDB findAndModify Java-Beispiel

Die oben dargestellten Operationen wurden alle manuell mit der Mongo-Shell durchgeführt. Das Gleiche kann programmatisch in Java wie unten beschrieben durchgeführt werden. Laden Sie das Mongo-Treiber-JAR herunter und fügen Sie es Ihrem Klassenpfad hinzu. Zuerst müssen wir eine Verbindung zum MongoDB-Server herstellen, indem wir den Mongo-Client verwenden. Der Name der Datenbank sollte als Parameter für die Verbindung angegeben werden. Wenn die Datenbank nicht existiert, wird eine neue Datenbank erstellt. Danach werden wir einige Datensätze in die Datenbank einfügen und eine findAndModify-Operation durchführen und dann überprüfen, ob die Datensätze tatsächlich aktualisiert wurden. Das folgende Programm funktioniert mit den Mongo-Java-Treiber-Versionen 2.x.

Go
package com.journaldev.mongodb;

import java.net.UnknownHostException;

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.MongoClient;

public class MongoDBFindAndModify {

	public static void main(String[] args) throws UnknownHostException {
		// Get a new connection to the db assuming it is running.
		MongoClient mongoClient = new MongoClient("localhost");
		// use test as the database. Use your database here.
		DB db = mongoClient.getDB("test");

		DBCollection coll = db.getCollection("car");
		
		// insert some test data to start with.
		BasicDBObject obj = new BasicDBObject();
		obj.append("name", "Volkswagen");
		obj.append("color", "JetBlue");
		obj.append("cno", "H672");
		obj.append("speed", 62);
		obj.append("mfdcountry", "Italy");
		coll.insert(obj);
		
		// findAndModify operation. Update colour to blue for cars having speed
		// < 45
		DBObject query = new BasicDBObject("speed",
				new BasicDBObject("$lt", 45));
		DBObject update = new BasicDBObject();
		update.put("$set", new BasicDBObject("color", "Blue"));
		DBCursor cursor = coll.find();
		try {
			while (cursor.hasNext()) {
				System.out.println(cursor.next());
			}
		} finally {
			cursor.close();
		}
		coll.findAndModify(query, update);
	}
}

Output

Code
//Test Data Before Insert
{ "_id" : 2.0 , "name" : "Polo" , "color" : "White" , "cno" : "H411" , "speed" : 45.0 , "mfdcountry" : "Japan"}
{ "_id" : 3.0 , "name" : "Audi" , "color" : "Black" , "cno" : "H412" , "speed" : 50.0 , "mfdcountry" : "Germany"}


//Test Data After insert
{ "_id" : 2.0 , "name" : "Polo" , "color" : "White" , "cno" : "H411" , "speed" : 45.0 , "mfdcountry" : "Japan"}
{ "_id" : 3.0 , "name" : "Audi" , "color" : "Black" , "cno" : "H412" , "speed" : 50.0 , "mfdcountry" : "Germany"}
{ "_id" : { "$oid" : "546cc76093f404729e2e946e"} , "name" : "Volkswagen" , "color" : "JetBlue" , "cno" : "H672" , "speed" : 62 , "mfdcountry" : "Italy"}


/*Test Data Before findandModify
{ "_id" : 2.0 , "name" : "Polo" , "color" : "White" , "cno" : "H411" , "speed" : 45.0 , "mfdcountry" : "Japan"}
{ "_id" : 3.0 , "name" : "Audi" , "color" : "Black" , "cno" : "H412" , "speed" : 50.0 , "mfdcountry" : "Germany"}
{ "_id" : { "$oid" : "546cc76093f404729e2e946e"} , "name" : "Volkswagen" , "color" : "JetBlue" , "cno" : "H672" , "speed" : 62 , "mfdcountry" : "Italy"}
{ "_id" : { "$oid" : "546c7c7d6be0faf69ee36546"} , "name" : "WagonR" , "speed" : 5.0}


/*Test Data After findAndModify
{ "_id" : 2.0 , "name" : "Polo" , "color" : "White" , "cno" : "H411" , "speed" : 45.0 , "mfdcountry" : "Japan"}
{ "_id" : 3.0 , "name" : "Audi" , "color" : "Black" , "cno" : "H412" , "speed" : 50.0 , "mfdcountry" : "Germany"}
{ "_id" : { "$oid" : "546cc76093f404729e2e946e"} , "name" : "Volkswagen" , "color" : "JetBlue" , "cno" : "H672" , "speed" : 62 , "mfdcountry" : "Italy"}
{ "_id" : { "$oid" : "546c7c7d6be0faf69ee36546"} , "name" : "WagonR" , "speed" : 5.0 , "color" : "Blue"}

Wenn Sie den MongoDB-Java-Treiber in der Version 3.x verwenden, dann benutzen Sie das folgende Programm.

Go
package com.journaldev.mongodb.main;

import java.net.UnknownHostException;

import org.bson.Document;
import org.bson.conversions.Bson;

import com.mongodb.MongoClient;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
 
public class MongoDBFindAndModify {
 
    public static void main(String[] args) throws UnknownHostException {
        // Get a new connection to the db assuming it is running.
        MongoClient mongoClient = new MongoClient("localhost");
        
        // use test as the database. Use your database here.
        MongoDatabase db = mongoClient.getDatabase("test");
 
        MongoCollection coll = db.getCollection("car");
         
        // insert some test data to start with.
        Document obj = new Document();
        obj.append("name", "Volkswagen");
        obj.append("color", "JetBlue");
        obj.append("cno", "H672");
        obj.append("speed", 62);
        obj.append("mfdcountry", "Italy");
        coll.insertOne(obj);
         
        // findAndModify operation. Update color to blue for cars having speed > 45
        Bson query = new Document("speed",
                new Document("$gt", 45));
        Bson update = new Document("$set", 
        			new Document("color", "Blue"));
        
        System.out.println("before update");
        findAndPrint(coll);
        
        coll.findOneAndUpdate(query, update);
        
        System.out.println("after update of color field");
        findAndPrint(coll);
        
        mongoClient.close();

    }

	private static void findAndPrint(MongoCollection coll) {
		FindIterable cursor = coll.find();
        
		for (Document d : cursor)
			System.out.println(d);
	}
}

Das ist alles für das MongoDB findAndModify-Beispiel, wir werden in kommenden Beiträgen mehr MongoDB-Operationen betrachten.

Jetzt 200 € Guthaben sichern

Testen Sie Ihr Setup auf ccloud³

Registrieren Sie sich in der ccloud³ und erhalten Sie 200 € Startguthaben für Ihr Projekt – z. B. für eine PostgreSQL-VM mit automatischen Backups.

centron Redaktion Technische Redaktion

Das Redaktionsteam von centron schreibt Anleitungen aus dem Betriebsalltag: getestet auf unserer eigenen Plattform, betrieben im Rechenzentrum in Hallstadt bei Bamberg.

Kategorie Databases
Teilen
Noch offene Fragen?

Unser Team hilft Ihnen bei Ihrem konkreten Setup weiter – von Menschen, die die Plattform selbst betreiben.

War dieses Tutorial hilfreich?

Ihre Antwort wird anonym gespeichert und hilft uns, die Tutorials zu verbessern.

Kommentare

Noch keine Kommentare – stellen Sie die erste Frage zu diesem Tutorial.

Zum Kommentieren anmelden

Kommentare stehen centron-Kunden offen. Melden Sie sich in Ihrem Konto an, um eine Frage zu diesem Tutorial zu stellen.

Weiterlesen

Das könnte Sie auch interessieren

Jetzt kostenlos anfangen

Melden Sie sich an und erhalten Sie in den ersten 60 Tagen ein Guthaben von 200 € bei centron.

Dieses Werbeangebot gilt nur für neue Konten. Angebot ausschließlich für Gewerbetreibende.

Jetzt loslegen Sales kontaktieren