4.4 - Connexió des de Java
Per a poder connectar des de Java ens sera suficient amb un driver, que haurem d'incorporar al projecte. En la següent pàgina podem trobar-lo, en diferents versions:
https://oss.sonatype.org/content/repositories/releases/org/mongodb/mongo-java-driver
En el moment de fer aquestos apunts, l'últim driver disponible és el següent:
Per a separar les proves i exercicis de la part de Redis, creem un nou projecte anomenat Tema7_2 , en un paquet anomenat Exemples.
Connexió
La connexió és tan senzilla com el següent:
MongoClient con = new MongoClient("localhost" , 27017);
MongoDatabase bd = con.getDatabase("test");
És a dir, obtenim un objecte MongoClient passant-li al constructor l'adreça del servidor i el port de connexió (que per defecte és 27017).
Posteriorment hem de connectar amb la Base de Dades. Ja havíem comentat en la instal·lació de Mongo que nosaltres només utilitzaríem una Base de Dades ja creada anomenada test. Obtenim un objecte MongoDatabase que farà referència a la Base de Dades, i és l'objecte que utilitzarem a partir d'ara. Evidentment ho podríem haver fet en una única línia.
Si el servidor no el tenim en la mateixa màquina, només haurem de substituir localhost per l'adreça on estiga el servidor.
Per a tancar la connexió:
con.close();
Inserció de documents
Des de Java podrem inserir documents amb la mateixa facilitat que des de la consola. Només haurem de crear un objecte Document de BSON (recordeu que és el format intern de Mongo, absolutament similar a JSON). La manera d'anar posant parelles calu valor en aquest document és per mig del mètode put. Fem un exemple molt senzill on senzillament guardem un document amb una parella clau-valor d'un missatge:
import org.bson.Document;
import com.mongodb.MongoClient;
import com.mongodb.client.MongoDatabase;
public class Prova1 {
public static void main(String[] args) {
MongoClient con = new MongoClient("localhost" , 27017);
MongoDatabase bd = con.getDatabase("test");
Document doc = new Document();
doc.put("msg4", "Missatge inserit des de Java");
bd.getCollection("exemple").insertOne(doc);
con.close();
}
}
Segurament traurà avisos en la consola, però només són avisos. Podem comprovar en la terminal com s'ha inserit el document:

Consultes
Tenim el mètode find() per a fer consultes, i li podem posar un document com a paràmetre per a seleccionar determinats documents o traure determinada informació.
import org.bson.Document;
import com.mongodb.MongoClient;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoDatabase;
public class Prova2 {
public static void main(String[] args) {
MongoClient con = new MongoClient("localhost" , 27017);
MongoDatabase bd = con.getDatabase("test");
FindIterable<Document> llibres = bd.getCollection("libro").find();
for (Document llibre : llibres)
System.out.println(llibre.get("titulo"));
con.close();
}
}
I com comentàvem podem posar com a paràmetres en el find() per a seleccionar determinats documents, ordenar, etc. Només hem de cuidar que ho hem de posar en JSON (millor dit BSON), i per tant haurem de crear un document per a això.
import org.bson.Document;
import com.mongodb.MongoClient;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoDatabase;
public class Prova3 {
public static void main(String[] args) {
MongoClient con = new MongoClient("localhost" , 27017);
MongoDatabase bd = con.getDatabase("test");
Document ordenar = new Document();
ordenar.put("precio", -1);
FindIterable<Document> llibres = bd.getCollection("libro").find().sort(ordenar);
for (Document llibre : llibres)
System.out.println("Títol:" + llibre.get("titulo") + ". Preu:" + llibre.get("precio"));
con.close();
}
}
El resultat serà aquest:
de gen. 31, 2017 8:36:55 AM com.mongodb.diagnostics.logging.JULLogger log
INFO: Cluster created with settings {hosts=[localhost:27017], mode=SINGLE, requiredClusterType=UNKNOWN, serverSelectionTimeout='30000 ms', maxWaitQueueSize=500}
de gen. 31, 2017 8:36:56 AM com.mongodb.diagnostics.logging.JULLogger log
INFO: No server chosen by ReadPreferenceServerSelector{readPreference=primary} from cluster description ClusterDescription{type=UNKNOWN, connectionMode=SINGLE, all=[ServerDescription{address=localhost:27017, type=UNKNOWN, state=CONNECTING}]}. Waiting for 30000 ms before timing out
de gen. 31, 2017 8:36:56 AM com.mongodb.diagnostics.logging.JULLogger log
INFO: Opened connection [connectionId{localValue:1, serverValue:10}] to localhost:27017
de gen. 31, 2017 8:36:56 AM com.mongodb.diagnostics.logging.JULLogger log
INFO: Monitor thread successfully connected to server with description ServerDescription{address=localhost:27017, type=STANDALONE, state=CONNECTED, ok=true, version=ServerVersion{versionList=[3, 4, 1]}, minWireVersion=0, maxWireVersion=5, maxDocumentSize=16777216, roundTripTimeNanos=549242}
de gen. 31, 2017 8:36:56 AM com.mongodb.diagnostics.logging.JULLogger log
INFO: Opened connection [connectionId{localValue:2, serverValue:11}] to localhost:27017
Títol:Circo Máximo. Preu:21.75
Títol:El juego de Ripper. Preu:21.75
Títol:Las carreras de Escorpio. Preu:17.23
Títol:Las reglas del juego. Preu:15.9
Títol:La princesa de hielo. Preu:11.0
Títol:Juego de tronos: Canción de hielo y fuego 1. Preu:9.5
Títol:La ladrona de libros. Preu:9.45
de gen. 31, 2017 8:36:56 AM com.mongodb.diagnostics.logging.JULLogger log
INFO: Closed connection [connectionId{localValue:2, serverValue:11}] to localhost:27017 because the pool has been closed.
Hem pogut observar en l'execució dels exemples anteriors que ens trau una gran quantitat d'avisos. No són errors, sinó senzillament informació de com van les connexions, que mongo torna, i apareixen en l'eixida estàndar.
Si no volem que apareguen podem posar al principi del programa unes sentències per a dir que únicament apareguen els errors, i no els avisos. Els errors estarien en la categoria de SEVERE
Logger mongoLogger = Logger.getLogger( "org.mongodb.driver" );
mongoLogger.setLevel(Level.SEVERE);
Hem d'importar les classes de java.util. Quedaria el mateix exemple d'aquesta manera:
import java.util.logging.Level;
import java.util.logging.Logger;
import org.bson.Document;
import com.mongodb.MongoClient;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoDatabase;
public class Prova3 {
public static void main(String[] args) {
Logger mongoLogger = Logger.getLogger( "org.mongodb.driver" );
mongoLogger.setLevel(Level.SEVERE);
MongoClient con = new MongoClient("localhost" , 27017);
MongoDatabase bd = con.getDatabase("test");
Document ordenar = new Document();
ordenar.put("precio", -1);
FindIterable<Document> llibres = bd.getCollection("libro").find().sort(ordenar);
for (Document llibre : llibres)
System.out.println("Títol:" + llibre.get("titulo") + ". Preu:" + llibre.get("precio"));
con.close();
}
}
I el resultat ara serà:
Títol:Circo Máximo. Preu:21.75
Títol:El juego de Ripper. Preu:21.75
Títol:Las carreras de Escorpio. Preu:17.23
Títol:Las reglas del juego. Preu:15.9
Títol:La princesa de hielo. Preu:11.0
Títol:Juego de tronos: Canción de hielo y fuego 1. Preu:9.5
Títol:La ladrona de libros. Preu:9.45