Il metodo findAndModify() di MongoDB modifica e restituisce un singolo documento in base ai criteri di selezione inseriti. Il documento restituito non mostra il contenuto aggiornato per impostazione predefinita. Se i record corrispondenti ai criteri non esistono nel database, verrà inserito un nuovo record se l’opzione upsert è impostata su true.
MongoDB findAndModify()
La sintassi per il metodo findAndModify di MongoDB è la seguente.
db.collection.findAndModify({
query: <document>,
sort: <document>,
new: <boolean>,
fields: <document>,
upsert: <boolean>
})
La descrizione dei parametri è la seguente. query: Definisce i criteri di selezione per la modifica del record. sort: Determina quale documento deve essere modificato quando i criteri di selezione recuperano più documenti. new: indica che il documento modificato verrà visualizzato. fields: specifica l’insieme di campi da restituire. upsert: crea un nuovo documento se i criteri di selezione non recuperano un documento esistente.
Punti importanti di MongoDB findAndModify
Alcuni aspetti da tenere presente durante l’utilizzo delle chiamate findAndModify di MongoDB sono:
- Se i criteri di selezione inseriti non restituiscono alcun documento e upsert è impostato su true, i valori specificati vengono inseriti e viene creato un nuovo documento.
- Se i criteri di selezione inseriti non restituiscono alcun documento durante le operazioni di aggiornamento o rimozione, l’output restituito è nullo.
- Se l’opzione new è impostata su false e l’operazione di ordinamento non è specificata, l’output restituito è nullo.
- Se l’opzione new è impostata su false e l’operazione di ordinamento è specificata, l’output è vuoto.
Esempio di findAndModify di MongoDB
Ora vediamo alcuni esempi che dimostrano l’uso dell’API findAndModify. Per prima cosa, creiamo alcuni dati di test. Creeremo un nuovo documento auto con campi nome, colore, numero auto (cno), velocità e paese di fabbricazione (mfdcountry) tramite la console mongo.
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" }
]
)
Verifichiamo ora che i dati siano stati effettivamente inseriti usando 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" }
Passando all’effettivo utilizzo di find and modify, mostriamo diverse possibilità. Caso 1: Il documento esiste nel database
db.car.findAndModify({
query: { name: "Alto" },
sort: { cno: 1 },
update: { $inc: { speed: 10 } },
})
- Il comando di ordinamento dispone i risultati della query in ordine crescente. Se diversi documenti soddisfano la condizione della query, il metodo selezionerà per la modifica il primo documento nell’ordine impostato da questo ordinamento.
- L’aggiornamento incrementa il valore del campo velocità di 10.
- Il metodo restituisce il documento originale selezionato per questo aggiornamento:
Output:
{
"_id" : 1,
"name" : "Alto",
"color" : "Red",
"cno" : "H410",
"speed" : 40,
"mfdcountry" : "India"
}
Caso 2: La nuova opzione impostata su true (restituisce il set di dati aggiornato)
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
}
Si noti che la velocità viene visualizzata come 45, che è il valore aggiornato poiché abbiamo impostato new su true. Se ciò non è impostato, il campo della velocità verrà mostrato come 20, il vecchio valore anche se viene aggiornato nel database. Caso 3: Upsert è impostato su true
db.car.findAndModify({
query: { name: "WagonR" },
sort: { cno: 1 },
update: { $inc: { speed: 5 } },
upsert: <strong>true</strong>
})
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 }
Il nome dell’auto con WagonR non è nel database, quindi viene creato un nuovo documento nel database. Il metodo restituisce un documento vuoto { } se l’opzione di ordinamento è specificata. Se l’opzione di ordinamento non è inclusa, il metodo restituisce null. Oltre a ciò, questo può anche essere utilizzato per eseguire un’operazione di ordinamento e rimozione. Se il campo di rimozione è impostato su true, il nome dell’auto con i criteri specificati verrà rimosso dal database.
db.car.findAndModify(
{
query: { name: "Alto" },
sort: { cno: 1 },
remove: true
}
)
Output:
{
"_id" : 1,
"name" : "Alto",
"color" : "Red",
"cno" : "H410",
"speed" : 50,
"mfdcountry" : "India"
}
Il campo di rimozione è impostato su true, il documento con il nome “Alto” viene eliminato dal database.
Esempio Java di findAndModify di MongoDB
Le operazioni rappresentate sopra sono tutte eseguite manualmente utilizzando la shell di mongo. Lo stesso può essere fatto in modo programmato in Java come segue. Scarica il driver di mongo e aggiungilo al tuo classpath. Prima di tutto, dobbiamo stabilire una connessione al server mongodb utilizzando il client Mongo. Il nome del database deve essere specificato come parametro per la connessione. Se il database non esiste, verrà creato un nuovo database. Dopo questo, aggiungeremo alcuni record nel database e faremo un’operazione findAndModify e poi verificheremo se i record sono effettivamente aggiornati. Il programma sottostante funziona con le versioni 2.x del driver di mongo java.
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 {
// Ottieni una nuova connessione al database supponendo che sia in esecuzione.
MongoClient mongoClient = new MongoClient("localhost");
// Usa "test" come database. Usa il tuo database qui.
DB db = mongoClient.getDB("test");
DBCollection coll = db.getCollection("car");
// Inserisci alcuni dati di test per iniziare.
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);
// Operazione findAndModify. Aggiorna il colore in blu per le auto con velocità
// < 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:
// Dati di test prima dell'inserimento
{ "_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"}
// Dati di test dopo l'inserimento
{ "_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"}
Se stai utilizzando il driver di MongoDB versione 3.x, utilizza il programma sottostante.
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 {
// Ottieni una nuova connessione al database supponendo che sia in esecuzione.
MongoClient mongoClient = new MongoClient("localhost");
// Usa "test" come database. Usa il tuo database qui.
MongoDatabase db = mongoClient.getDatabase("test");
MongoCollection coll = db.getCollection("car");
// Inserisci alcuni dati di test per iniziare.
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);
// Operazione findAndModify. Aggiorna il colore in blu per le auto con velocità > 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);
}
}
Ecco l’immagine che mostra l’output del programma precedente. Notate la variazione nel campo del colore. Questo è tutto per l’esempio di findAndModify di MongoDB. Esamineremo ulteriori operazioni di MongoDB nei prossimi articoli. Riferimento: Documentazione Ufficiale di MongoDB
Source:
https://www.digitalocean.com/community/tutorials/mongodb-findandmodify-example