MongoDB findAndModify() methode past en wijzigt een enkel document op basis van de opgegeven selectiecriteria. Het teruggegeven document toont standaard niet de bijgewerkte inhoud. Als er geen records overeenkomen met de criteria in de database, wordt een nieuw record ingevoegd als upsert is ingesteld op true.
MongoDB findAndModify()
De syntaxis voor de findAndModify-methode in MongoDB is als volgt.
db.collection.findAndModify({
query: <document>,
sort: <document>,
new: <boolean>,
fields: <document>,
upsert: <boolean>
})
De beschrijving van de parameters is als volgt. query: Definieert de selectiecriteria voor welk record moet worden gewijzigd. sort: Bepaalt welk document moet worden gewijzigd wanneer de selectiecriteria meerdere documenten opleveren. new: Geeft aan dat het gewijzigde document wordt weergegeven. fields: Specificeert de set velden die moeten worden geretourneerd. upsert: Maakt een nieuw document aan als de selectiecriteria geen document ophalen.
Belangrijke punten bij MongoDB findAndModify
Enkele dingen om in gedachten te houden bij het gebruik van de findAndModify-oproepen in MongoDB zijn:
- Als de ingevoerde selectiecriteria geen enkel document opleveren en als upsert is ingesteld op waar, worden de gespecificeerde waarden ingevoegd en wordt een nieuw document aangemaakt.
- Als de ingevoerde selectiecriteria geen enkel document opleveren bij het uitvoeren van update- of verwijderingsbewerkingen, is de geretourneerde output null.
- Als de nieuwe optie is ingesteld op false en de sorteerbewerking niet is vermeld, is de geretourneerde output null.
- Als de nieuwe optie is ingesteld op false en de sorteerbewerking is gespecificeerd, is de output leeg.
Voorbeeld van MongoDB findAndModify
Laten we nu enkele voorbeelden bekijken die het gebruik van de findAndModify API demonstreren. Laten we eerst wat testgegevens maken om mee te beginnen. We zullen een nieuw autodocument aanmaken met de velden naam, kleur, autonummer (cno), snelheid en land van fabricage (mfdcountry) via de mongo-console.
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" }
]
)
Laten we nu controleren of de gegevens daadwerkelijk zijn ingevoegd met behulp van mongodb find:
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" }
Wat betreft het daadwerkelijke gebruik van find and modify, tonen we verschillende mogelijkheden. Geval 1: Het document bestaat in de database
db.car.findAndModify({
query: { name: "Alto" },
sort: { cno: 1 },
update: { $inc: { speed: 10 } },
})
- De query vindt een document in de autocollectie waar het veld naam de waarde Alto heeft.
- De sortering rangschikt de resultaten van de query in oplopende volgorde. Als aan de queryvoorwaarde wordt voldaan door meerdere documenten, selecteert de methode het eerste document voor wijziging zoals bepaald door deze sortering.
- De update verhoogt de waarde van het snelheidsveld met 10.
- De methode retourneert het oorspronkelijke document dat is geselecteerd voor deze update:
Uitvoer:
{
"_id" : 1,
"name" : "Alto",
"color" : "Red",
"cno" : "H410",
"speed" : 40,
"mfdcountry" : "India"
}
Case 2: De nieuwe optie ingesteld op true (retourneert de bijgewerkte dataset)
db.car.findAndModify({
query: { name: "HondaCity", color: "Silver", cno:"H415" ,speed: 25 },
sort: { cno: 1 },
update: { $inc: { speed: 20 } },
upsert: true,
new: true
})
Uitvoer:
{
"_id" : ObjectId("546c9f347256eabc40c9da1c"),
"cno" : "H415",
"color" : "Silver",
"name" : "HondaCity",
"speed" : 45
}
Merk op dat de snelheid wordt weergegeven als 45, wat de bijgewerkte waarde is, omdat we nieuw hebben ingesteld op true. Als dit niet is ingesteld, wordt het snelheidsveld weergegeven als 20, de oude waarde, hoewel het wordt bijgewerkt in de database.Case 3: De upsert is ingesteld op true
db.car.findAndModify({
query: { name: "WagonR" },
sort: { cno: 1 },
update: { $inc: { speed: 5 } },
upsert: <strong>true</strong>
})
Uitvoer:
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 }
De autonaam met WagonR staat niet in de database, dus er wordt een nieuw document in de database aangemaakt. De methode retourneert een leeg document { } als de sorteeroptie is gespecificeerd. Als de sorteeroptie niet is opgenomen, retourneert de methode null. Afgezien hiervan kan dit ook worden gebruikt voor een Sorteer- en Verwijderbewerking. Als het verwijderingsveld is ingesteld op true, wordt de autonaam met de gespecificeerde criteria uit de database verwijderd.
db.car.findAndModify(
{
query: { name: "Alto" },
sort: { cno: 1 },
remove: true
}
)
Uitvoer:
{
"_id" : 1,
"name" : "Alto",
"color" : "Red",
"cno" : "H410",
"speed" : 50,
"mfdcountry" : "India"
}
Het verwijderingsveld is ingesteld op true, het document met de naam “Alto” wordt uit de database verwijderd.
MongoDB findAndModify Java-voorbeeld
De bovenstaande handelingen worden allemaal handmatig uitgevoerd met behulp van de mongo shell. Hetzelfde kan programmatisch worden gedaan in Java zoals hieronder. Download de mongo driver jar en voeg deze toe aan je classpath. Allereerst moeten we een verbinding tot stand brengen met de mongodb-server met behulp van de Mongo-client. De naam van de database moet worden gespecificeerd voor de verbinding als een parameter. Als de database niet bestaat, wordt er een nieuwe database aangemaakt. Hierna voegen we een paar records toe aan de database en voeren we een findAndModify-operatie uit en controleren vervolgens of de records daadwerkelijk zijn bijgewerkt. Het onderstaande programma werkt met mongo java driver versies 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 {
// Verkrijg een nieuwe verbinding met de db, ervan uitgaande dat deze draait.
MongoClient mongoClient = new MongoClient("localhost");
// Gebruik 'test' als de database. Gebruik hier jouw database.
DB db = mongoClient.getDB("test");
DBCollection coll = db.getCollection("car");
// Voeg wat testgegevens toe om mee te 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-operatie. Update kleur naar blauw voor auto's met snelheid
// < 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:
// Testgegevens voor invoegen
{ "_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"}
// Testgegevens na invoegen
{ "_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"}
Als je MongoDB java driver versies 3.x gebruikt, gebruik dan het onderstaande programma.
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 {
// Verkrijg een nieuwe verbinding met de db, ervan uitgaande dat deze draait.
MongoClient mongoClient = new MongoClient("localhost");
// Gebruik 'test' als de database. Gebruik hier jouw database.
MongoDatabase db = mongoClient.getDatabase("test");
MongoCollection coll = db.getCollection("car");
// Voeg wat testgegevens toe om mee te 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-operatie. Update kleur naar blauw voor auto's met snelheid > 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);
}
}
Onderstaande afbeelding toont de uitvoer van het bovenstaande programma, let op de verandering in het kleurveld. Dat is alles voor het MongoDB findAndModify-voorbeeld, we zullen meer MongoDB-bewerkingen bespreken in de komende berichten. Referentie: MongoDB Officiële Documentatie
Source:
https://www.digitalocean.com/community/tutorials/mongodb-findandmodify-example