Die Methode findAndModify() in MongoDB ändert und gibt ein einzelnes Dokument basierend auf den eingegebenen Auswahlkriterien zurück. Das zurückgegebene Dokument zeigt standardmäßig den aktualisierten Inhalt nicht an. Wenn keine Datensätze mit den Kriterien in der Datenbank übereinstimmen und upsert auf true gesetzt ist, wird ein neuer Datensatz eingefügt.
MongoDB findAndModify()
Die Syntax für die Methode findAndModify in MongoDB lautet wie folgt:
db.collection.findAndModify({
query: <document>,
sort: <document>,
new: <boolean>,
fields: <document>,
upsert: <boolean>
})
Die Beschreibung der Parameter lautet wie folgt. query: Definiert die Auswahlkriterien, welche Datensätze geändert werden sollen. sort: Bestimmt, welches Dokument geändert wird, wenn die Auswahlkriterien mehrere Dokumente zurückgeben. new: Gibt an, dass das geänderte Dokument angezeigt wird. fields: Gibt die zu zurückgebenden Felder an. upsert: Erstellt ein neues Dokument, wenn die Auswahlkriterien kein Dokument zurückgeben.
Wichtige Punkte bei der Verwendung von findAndModify in MongoDB
Einige Dinge, die beim Verwenden der findAndModify-Mongodb-Aufrufe beachtet werden sollten, sind:
- Wenn die eingegebenen Auswahlkriterien kein Dokument abrufen und upsert auf true gesetzt ist, werden die angegebenen Werte eingefügt und ein neues Dokument erstellt.
- Wenn die eingegebenen Auswahlkriterien beim Ausführen von Aktualisierungs- oder Entfernungsoperationen kein Dokument abrufen, wird null zurückgegeben.
- Wenn die new-Option auf false gesetzt ist und keine Sortieroperation angegeben ist, wird null zurückgegeben.
- Wenn die new-Option auf false gesetzt ist und eine Sortieroperation angegeben ist, ist die Ausgabe leer.
MongoDB findAndModify Beispiel
Jetzt sehen wir uns einige Beispiele zur Verwendung der findAndModify-API an. Zuerst erstellen wir einige Testdaten, um zu beginnen. Wir erstellen ein neues Autodokument mit den Feldern Name, Farbe, Autonummer (cno), Geschwindigkeit und Herstellungsland (mfdcountry) über die mongo-Konsole.
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" }
]
)
Überprüfen wir nun, ob die Daten tatsächlich mit mongodb find eingefügt wurden:
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" }
Kommen wir zur tatsächlichen Verwendung von find and modify und zeigen verschiedene Möglichkeiten auf. Fall 1: Das Dokument existiert in der Datenbank
db.car.findAndModify({
query: { name: "Alto" },
sort: { cno: 1 },
update: { $inc: { speed: 10 } },
})
- Die Abfrage findet ein Dokument in der Autokollektion, bei dem das Feld Name den Wert Alto hat.
- Die Sortierung ordnet die Ergebnisse der Abfrage in aufsteigender Reihenfolge. Wenn mehrere Dokumente die Abfragebedingung erfüllen, wählt die Methode das erste Dokument zur Bearbeitung aus, wie durch diese Sortierung festgelegt.
- Das Update erhöht den Wert des Feldes „speed“ um 10.
- Die Methode gibt das ursprünglich ausgewählte Dokument für dieses Update zurück:
Ausgabe:
{
"_id" : 1,
"name" : "Alto",
"color" : "Red",
"cno" : "H410",
"speed" : 40,
"mfdcountry" : "India"
}
Fall 2: Die neue Option ist auf true gesetzt (gibt den aktualisierten Datensatz zurück)
db.car.findAndModify({
query: { name: "HondaCity", color: "Silver", cno:"H415" ,speed: 25 },
sort: { cno: 1 },
update: { $inc: { speed: 20 } },
upsert: true,
new: true
})
Ausgabe:
{
"_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
db.car.findAndModify({
query: { name: "WagonR" },
sort: { cno: 1 },
update: { $inc: { speed: 5 } },
upsert: <strong>true</strong>
})
Ausgabe:
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 Auto-Name „WagonR“ ist nicht in der Datenbank vorhanden, daher wird ein neues Dokument in der Datenbank erstellt. Die Methode gibt ein leeres Dokument { } zurück, wenn die Sortieroption angegeben ist. Wenn die Sortieroption nicht enthalten ist, gibt die Methode null zurück. Neben diesen Optionen kann dies auch für eine Sortier- und Entfernungsoperation verwendet werden. Wenn das Entfernungsfeld auf true gesetzt ist, wird der Auto-Name mit den angegebenen Kriterien aus der Datenbank entfernt.
db.car.findAndModify(
{
query: { name: "Alto" },
sort: { cno: 1 },
remove: true
}
)
Ausgabe:
{
"_id" : 1,
"name" : "Alto",
"color" : "Red",
"cno" : "H410",
"speed" : 50,
"mfdcountry" : "India"
}
Das Entfernungsfeld ist auf true gesetzt, das Dokument mit dem Namen „Alto“ wird aus der Datenbank gelöscht.
MongoDB findAndModify Java-Beispiel
Die oben dargestellten Vorgänge werden alle manuell mit dem Mongo-Shell durchgeführt. Das Gleiche kann programmatisch in Java wie folgt erfolgen. Laden Sie das Mongo-Treiber-Jar herunter und fügen Sie es Ihrem Klassenpfad hinzu. Zunächst müssen wir eine Verbindung zum MongoDB-Server mit dem Mongo-Client herstellen. Der Name der Datenbank sollte als Parameter für die Verbindung angegeben werden. Wenn die Datenbank nicht vorhanden ist, wird eine neue Datenbank erstellt. Danach fügen wir einige Datensätze in die Datenbank ein und führen eine findAndModify-Operation durch, um zu überprüfen, ob die Datensätze tatsächlich aktualisiert wurden. Das folgende Programm funktioniert mit den Mongo Java-Treiber-Versionen 2.x.
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 {
// Holen Sie eine neue Verbindung zur Datenbank, vorausgesetzt sie läuft.
MongoClient mongoClient = new MongoClient("localhost");
// Verwenden Sie hier test als Datenbank. Verwenden Sie Ihre Datenbank.
DB db = mongoClient.getDB("test");
DBCollection coll = db.getCollection("car");
// Fügen Sie einige Testdaten ein, um zu beginnen.
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. Aktualisieren Sie die Farbe auf blau für Autos mit einer Geschwindigkeit
// < 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);
}
}
Ausgabe:
//Testdaten vor dem Einfügen
{ "_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"}
//Testdaten nach dem Einfügen
{ "_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 den Versionen 3.x verwenden, verwenden Sie das folgende Programm:
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 {
// Holen Sie eine neue Verbindung zur Datenbank, vorausgesetzt sie läuft.
MongoClient mongoClient = new MongoClient("localhost");
// Verwenden Sie hier test als Datenbank. Verwenden Sie Ihre Datenbank.
MongoDatabase db = mongoClient.getDatabase("test");
MongoCollection coll = db.getCollection("car");
// Fügen Sie einige Testdaten ein, um zu beginnen.
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. Aktualisieren Sie die Farbe auf blau für Autos mit einer Geschwindigkeit > 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 unten stehende Bild zeigt die Ausgabe des obigen Programms. Beachten Sie die Änderung im Farbfeld. Das war alles für das Beispiel „findAndModify“ von MongoDB. Wir werden uns in den kommenden Beiträgen mit weiteren MongoDB-Operationen befassen. Referenz: Offizielle MongoDB-Dokumentation
Source:
https://www.digitalocean.com/community/tutorials/mongodb-findandmodify-example