Mise en place Base MongoDB avec MongoJack

MongoDB, base NoSQL fonctionne avec un format de données orienté JSON. Sa configuration et son usage sont très simple, d'autant plus en utilisant la sur-couche mongo-Jack et MonjaDB sous eclipse.

http://www.mongodb.org

http://mongojack.org

MongoDB, base NoSQL fonctionne avec un format de données orienté JSON. Sa configuration et son usage sont très simple, d'autant plus en utilisant la sur-couche mongo-Jack et MonjaDB sous eclipse.

http://www.mongodb.org

http://mongojack.org

 

Installation de MongoDB sous Linux : 

 

sudo apt-get install mongodb

 

 

Import Maven : 

Driver MongoDB : 

<dependency>

<groupId>org.mongodb</groupId>

<artifactId>mongo-java-driver</artifactId>

<version>2.11.1</version>

</dependency>

 

Mongo Jack : 

<dependency>

<groupId>org.mongojack</groupId>

<artifactId>mongojack</artifactId>

<version>2.0.0-RC5</version>

</dependency>

 

 

Créer le DAO : 

On peut remarquer dans le code ci-dessous : 

Une fois la connexion créé, il peut gérer de deux façon différentes les collections d'objets : 

DBCollection : Objet qui gère uniquement des DBObject. On accède à ses éléments par : DBObject.get(KEY)

JacksonDBCollection : Objet qui gère permet de manipuler des POJO. Voir exemple de Pojo plus bas.

 

On peut gérer des index et de l'unicité avec la déclaration suivante :

(Ici on créé un index sur l'email de l'utilisateur, qui doit être unique)

userCollectionJackson.ensureIndex(new BasicDBObject("email""1"), new BasicDBObject("unique","true"));

 

L'objet GridFS, permet lui de stocker des fichiers :

 

GridFS gfsPhoto = new GridFS(database"photo");

 

 

 

public class DAO 

{

private static final DAO instance = new DAO();

private static MongoClient mongo;

private static DB database;

 

 

// Users

// Collection Mongo

private static DBCollection userCollection;

// Collection Jackson

private static JacksonDBCollection<User, String> userCollectionJackson;

 

// Plantes

// Collection Mongo

private static DBCollection planteCollection;

// Collection Jackson

private static JacksonDBCollection<Plante, String> planteCollectionJackson;

 

// Photos

private static GridFS gfsPhoto;

 

// Constructeur qui lance la connexion à la base

private DAO()

{

// On lance la connexion

try

{

mongo = new MongoClient("127.0.0.1", 27017);

 

}

catch (UnknownHostException e) 

{

e.printStackTrace();

}

database = mongo.getDB("plantecite");

 

userCollection = database.getCollection("user");

userCollectionJackson = JacksonDBCollection.wrap(userCollection, User.class, String.class);

userCollectionJackson.ensureIndex(new BasicDBObject("email""1"), new BasicDBObject("unique","true"));

 

planteCollection = database.getCollection("plante");

planteCollectionJackson = JacksonDBCollection.wrap(planteCollection, Plante.class, String.class);

planteCollectionJackson.ensureIndex(new BasicDBObject("nom_latin""1"), newBasicDBObject("unique""true"));

planteCollectionJackson.ensureIndex(new BasicDBObject("random""2d"));

 

gfsPhoto = new GridFS(database"photo");

}

 

// On ajout un utilisateur à la base

public static void insertUser(User user)

{

// Si il existe alors on envoi une exception

if(userCollectionJackson.findOne(DBQuery.is("email", user.getEmail()))!=null)

{

throw new ConflictException("Doublon");

}

List<String> roles = new ArrayList<String>();

roles.add("webapp-user");

user.setRoles(roles);

 

userCollectionJackson.insert(user);

}

 

// On insère une photo dans la base

public static void addPhoto(File file)

{

try

{

GridFSInputFile gfsFile = gfsPhoto.createFile(file);

gfsFile.save();

}

catch(IOException e)

{

e.printStackTrace();

}

}

 

// On récupère la photo d'une plante à partir du nom de sa photo

public static InputStream  getPhoto(String fileName)

{

GridFSDBFile imageForOutput = gfsPhoto.findOne(fileName);

 

return imageForOutput.getInputStream();

}

 

// On récupère toutes les plantes de la base

public static List<Plante> getAllPlante()

{

return planteCollectionJackson.find().toArray();

}

 

// On insère ou met à jour une plante

public static void upsertPlante(Plante plante)

{

Plante planteOld = planteCollectionJackson.findOne(DBQuery.is("nom_latin", plante.getNom_latin()));

// Si elle existe alors on est en update

if(planteOld != null)

{

planteCollectionJackson.updateById(planteOld.getId(), plante);

}

else

{

double[] random = {Math.random(), 0.0};

plante.setRandom(random);

planteCollectionJackson.insert(plante);

}

 

}

 

// On insère une plante

public static void insertPlante(Plante plante)

{

// Si il existe alors on envoi une exception

if(planteCollectionJackson.findOne(DBQuery.is("nom_latin", plante.getNom_latin()))!=null)

{

throw new ConflictException("Doublon");

}

 

planteCollectionJackson.insert(plante);

}

 

// On met à jour une plante

public static void updatePlante(Plante plante)

{

planteCollectionJackson.updateById(plante.getId(), plante);

}

 

// On modifie un plante pour lui associer une url de photo 

public static void setPhotoPlante(Plante plante, String url_photo)

{

plante.setUrl_photo(url_photo);

 

updatePlante(plante);

 

}

 

// On supprime une plante

public static void deletePlante(Plante plante)

{

try

{

planteCollectionJackson.removeById(plante.getId());

}

catch (NullPointerException  e) 

{

System.out.println("Delete : " + plante.getNom_latin() + " n'existe pas");

}

}

 

// On récupère une plante à partir de son id

public static Plante getPlanteById(String id)

{

return planteCollectionJackson.findOneById(id);

}

 

// On récupère une plante à partir du champ "nom latin"

public static Plante getPlanteByNomLatin(String nom_latin)

{

 

return planteCollectionJackson.findOne(DBQuery.regex("nom_latin", Pattern.compile(nom_latin, Pattern.CASE_INSENSITIVE)));

 

}

 

// On rècupère nbPlantes de la base de facon aléatoire

public static List<Plante> getRandomPlante(int nbPlantes)

{

return planteCollectionJackson.find((DBObject)JSON.parse("{url_photo:{$ne:null}, random : { $near : [" + Math.random() + ", 0] } }")).limit( nbPlantes ).toArray();

}

 

}

 

POJO Plante : 

 

public class User  implements Serializable

{

private static final long serialVersionUID = 8685607534046299572L;

 

@Id

@ObjectId

private String id;

private String email;

private String passwordhash;

private List<String> roles;

    

public User() {

super();

}

    

 

public User(String id) {

super();

this.id = id;

}

 

public String getId() {

return id;

}

 

public void setId(String id) {

this.id = id;

}

 

public String getEmail() {

return email;

}

public void setEmail(String email) {

this.email = email;

}

 

public String getPasswordhash() {

return passwordhash;

}

 

public void setPasswordhash(String passwordhash) {

this.passwordhash = passwordhash;

}

 

public List<String> getRoles() {

return roles;

}

 

public void setRoles(List<String> roles) {

this.roles = roles;

}

    

}

MonjaDB :

MonjaDB est un plugin d'Eclipse qui permet de se connecter à une base MongoDB, de la consulter, modifier, requêter.

Connexion à la base : 

Pour un usage local la config de base est suffisante. On peut configurer des connexions à distance en SSH (Pour nos serveurs d'intégration par exemple)

image

 

Exemple de requête : 

db.plante.count({famille : 'Araceae'})

Cette requête permet de compter le nombre de lignes dont la famille est 'Araceae'

Je vous invite à consulter la documentation pour connaître les différentes façon de requêter la base (qui n'a donc rien à voir avec du SQL!)

http://docs.mongodb.org/manual/reference/method/

Interface de MonjaDB : 

image

 

 

 

 

 

 

 

 

 

 

 

 

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.