MongoDB findAndModify() Beispiel
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.
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.
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.
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:
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
db.car.findAndModify({
query: { name: "Alto" },
sort: { cno: 1 },
update: { $inc: { speed: 10 } },
})
- Die Abfrage findet ein Dokument in der Autosammlung, 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 zur Modifikation das erste Dokument gemäß dieser Sortierung aus.
- Das Update erhöht den Wert des Geschwindigkeitsfeldes um 10.
- Die Methode gibt das ursprünglich ausgewählte Dokument für dieses Update zurück:
Output
{
"_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)
db.car.findAndModify({
query: { name: "HondaCity", color: "Silver", cno:"H415" ,speed: 25 },
sort: { cno: 1 },
update: { $inc: { speed: 20 } },
upsert: true,
new: true
})
Output
{
"_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: true
})
Output:
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.
db.car.findAndModify(
{
query: { name: "Alto" },
sort: { cno: 1 },
remove: true
}
)
Output:
{
"_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.
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
//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.
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.