• Aucun résultat trouvé

mongodb mongoose REST MongoDB

N/A
N/A
Protected

Academic year: 2022

Partager "mongodb mongoose REST MongoDB"

Copied!
30
0
0

Texte intégral

(1)

MongoDB

javascript et son ´ ecosyst` eme

Licence mention Informatique Universit´e Lille – Sciences et Technologies

(2)

MongoDB

une syst` eme de BD orient´ e documents terminologie mongodb :

entr´ee dans la base =document

ensemble de documents =collection(≡table)

les donn´ ees/documents sont stock´ es au format BSON

`

a chaque donn´ ee est associ´ ee un identifiant unique id MongoDB ne g` ere pas les transactions

serveur

lancement du serveur

mongod --dbpath chemin pour les bases lancement port 27017 par d´ efaut

Universit´e Lille – Sciences et Technologies - Licence mention Informatique javascript et son ´ecosyst`eme 2

(3)

mongo

shell client : mongo

show dbs pour lister les bases existantes use baseName pour utiliser (et cr´ eer) une base

show collections pour lister les collections de la base

(4)

CRUD operations

db.collectionName.find(args) db.collectionName.insert(args) db.collectionName.update(args) db.collectionName.delete(args)

Universit´e Lille – Sciences et Technologies - Licence mention Informatique javascript et son ´ecosyst`eme 4

(5)

exemples

use dbbooks show collections db.books.find()

db.books.insert({title : ’The Lord of the Ring’, author : ’JRRT’, year : 1954}) db.books.find()

db.books.insert({ title : ’Dune’, author : ’Herbert Frank’, year : 1965 }) db.books.find().pretty()

db.books.find({year : 1954})

db.books.insert({ title : ’Bilbo’, author : ’Jrrt’, year : 1954 })

db.books.update({ title : ’Bilbo’}, { $set : {author : ’JRRT’, year : 1937} }) db.books.find({author : ’JRRT’})

db.books.update({ title : ’Bilbo’}, { $set : { type : ’novel’} }) db.books.find({author : ’JRRT’})

db.books.deleteOne({author : ’Herbert Frank’}) db.books.deleteMany({author : ’JRRT’})

import de donn´ ees :

mongoimport --db dbbooks --collection books --type csv

--file ./books.csv --headerline

db.books.find({year : { $gt : 1980 }}).pretty()

mongodb v0

(6)

mongoose

par les cr´ eateurs de MongoDb

elegant MongoDb object modeling for Node.js permet de d´ efinir des mod` eles (sch´ emas) pour les documents facilite la gestion des connexions

Mongoose fait l’interface entre Node.js et MongoDb Mongoose = Object Data Modeler for Node.js installation : npm install mongoose --save

mongodb v0.5

Universit´e Lille – Sciences et Technologies - Licence mention Informatique javascript et son ´ecosyst`eme 6

(7)

mise en œuvre

acc´ eder ` a Mongoose :

const mongoose = require(’mongoose’);

´

etablir une connexion :

URI de connexion :

mongodb://username:password@host:port/database username,passwordetportsont optionnels

cr´eation de la connexion, deux possibilit´es :

mongoose.connect(URI, {useNewUrlParser: true, , useUnifiedTopology : true})

connexion d´efinie dansmongoose.connection

const dbConn = mongoose.createConnection(URI, options) permet de cr´eer plusieurs connexions et d’exporterdbConn g´erer les ´ev´enements de connexion et la d´econnexion

dbConnection.on(’connected’/’error’/’disconnect’,callback) mongoose.connect.on(’connected’, callback)si premier cas dbConnection.close( callback )

g´erer les diff´erentes situations de fin de processus

mongodb v1

(8)

bonne pratique : d´ efinir un contrˆ oleur pour g´ erer la BD

// dans /controllers/db.js

const mongoose = require(’mongoose’);

const dbURI = ’mongodb://localhost/dbbooks’;

const dbConnection

= mongoose.createConnection(dbURI, { useNewUrlParser: true });

module.exports = dbConnection; // export de la connexion cr´e´ee dbConnection.on(’connected’, ... );

dbConnection.on(’disconnected’, ... );

dbConnection.on(’error’, ... );

// process ends

process.on(’SIGINT’, ... ); // application killed (ctrl+c) process.once(’SIGUSR2’, ...); // pour nodemon

process.on(’SIGTERM’, ...); // process killed (POSIX)

Universit´e Lille – Sciences et Technologies - Licence mention Informatique javascript et son ´ecosyst`eme 8

(9)

efinition du mod` ele de donn´ ees

d´ efinir comment les donn´ ees sont structur´ ees

d´efinition d’un document =sch´ema une entr´ee dans un sch´ema = path

un sch´emaest constitu´e d’un ensemble depath

bonne pratique : d´ efinir un dossier models pour y placer les d´ efinitions des sch´ emas

un sch´ ema doit ˆ etre « compil´ e » en un mod` ele pour son utilisation

dans l’application

(10)

sch´ ema

d´ eclaration d’un sch´ ema

const theSchema = new mongoose.Schema( { les path du sch´ema } );

// dans /models/books.js

const mongoose = require(’mongoose’);

const bookSchema = new mongoose.Schema( { title : String,

author : String, cover : String, year : Number } );

pas de path pour id path :

pathName : objet propri´ et´ es

title : { type : String }

´

ecriture simplifi´ ee quand il n’y a que la propri´ et´ e type

Universit´e Lille – Sciences et Technologies - Licence mention Informatique javascript et son ´ecosyst`eme 10

mongodb v2

(11)

path

8 types possibles

String, Number, Date, Boolean, Buffer, Mixed, Array, ObjectId le type tableau se d´ eclare en plac ¸ant le type des ´ el´ ement entre crochets d’autres sch´ emas peuvent ˆ etre utilis´ es pour d´ efinir le type des

sous-documents

diff´ erentes options : default, required, set, get, ...

+ des options sp´ ecifiques aux diff´ erents types

Number: min,max

String: lowercase, ...

(12)

// dans /models/address.js

const addressSchema = new mongoose.Schema({

number : { type : Number, min : 1 }, street : String,

zip : Number,

town : { type : String, required : true}

});

module.exports = addressSchema;

// dans models/person.js

const addressSchema = require(’./address’);

const personSchema = new mongoose.Schema({

name : { type : String, required : true }, surnames : [String],

age : { type : Number, default : 18, set : v => Math.floor(v) }, birth : Date,

address : addressSchema });

module.exports = personSchema;

Universit´e Lille – Sciences et Technologies - Licence mention Informatique javascript et son ´ecosyst`eme 12

(13)

mod` eles

pour ˆ etre utilis´ e un sch´ ema doit ˆ etre « compil´ e » en un mod` ele le mod` ele permet les interactions avec une collection

on utilise la connection pour cr´ eer le mod` ele et le lier ` a une collection theConnection.model(modelName, schema, collectionName)

// dans models/books.js

const dbConnection = require(’../controllers/db’);

const bookSchema = new mongoose.Schema({...});

const Books = dbConnection.model(’Book’,bookSchema,’books’);

module.exports.schema = bookSchema;

module.exports.model = Books;

(14)

interactions avec les collections

on utilise le mod` ele pour manipuler la collection ` a laquelle il est attach´ e les op´ erations sont des promesses

op´ erations CRUD de base :

create

find update remove

Universit´e Lille – Sciences et Technologies - Licence mention Informatique javascript et son ´ecosyst`eme 14

(15)

find()

r´ ecup´ erer des documents dans une collection

mongodb v3

// dans /controllers/books.js

const Books = require(’../models/books’).model; // on r´ecup`ere le mod`ele var list =

(req, res) =>

Books.find()

.then( allBooks => res.render(’books’,

{ title : ’Book list’, books : allBooks } ) );

mongodb v3.1

Books.findOne() // /books/one

Books.find({title : ’Dune’}) // /books/dune Books.find({year : {$gt : 2000} }) // /books/yearv1 Books.find().where(’year’).gt(2000) // /books/yearv2

(16)

findById

mongodb v3.2

// dans /controllers/books.js

Books.findOne( { id : req.params.bookId } ) // /books/detailsv1 Books.findById( req.params.bookId ) // /books/detailsv2

Universit´e Lille – Sciences et Technologies - Licence mention Informatique javascript et son ´ecosyst`eme 16

(17)

create()

cr´ eation d’une nouvelle entr´ ee dans une collection

let newBook = { title : value, author : value, year : value, cover : value };

Books.create(newBook)

.then( newBook => ... );

(18)

mise en œuvre

mongodb v4 serveur : deux routes : pour le « formulaire » et la requˆ ete de cr´ eation

// routes/books.js

router.get(’/create’, booksController.createHome );

router.post(’/create’, booksController.create );

API REST :

m´ ethode utilisation Response POST Create new data nouvel objet cr´ e´ e

GET Read data objet r´ eponse de la requˆ ete PUT Update document objet mis ` a jour

DELETE Delete document null

mise en place de la vue /views/createBook.pug

qui charge cˆ ot´ e client le script /javascripts/create-book.js

Universit´e Lille – Sciences et Technologies - Licence mention Informatique javascript et son ´ecosyst`eme 18

(19)

ot´ e client

cˆ ot´ e client : mise en place de la requˆ ete

// dans /public/javascripts/create-book.js const createBook =

() => {

let newBook = { title : title.value , author : author.value, year : pubyear.value, cover : cover.value };

let body = JSON.stringify(newBook);

let requestOptions = { method : ’POST’, headers:{"Content-Type":"application/json"},

body : body };

fetch(’http://127.0.0.1:3000/books/create’, requestOptions) .then( response => response.json() )

.then( book => result.textContent = ‘book with id

${book._id} created‘);

}

(20)

cˆ ot´ e serveur : mise en place des contrˆ oleurs

// dans /controllers/books.js /* controller for GET /create */

const createHome =

(req,res) => res.render(’createBook’); // not REST /* controller for POST /create */

const createBook = (req, res, err) => {

//let newBook = { title : req.body.title, author : req.body.author, // year : req.body.year, cover : req.body.cover };

let newBook = { ...req.body } ; Books.create(newBook)

.then( newBook => res.status(200).json(newBook) );

}

Universit´e Lille – Sciences et Technologies - Licence mention Informatique javascript et son ´ecosyst`eme 20

(21)

validation du sch´ ema

mongodb v4.1 validation des donn´ ees par le sch´ ema avant tout ajout de donn´ ees

// dans /models/books.js

var setDefaultCover = cover => { ... } var bookSchema = new mongoose.Schema({

title : { type : String, required : true }, author : String,

cover : { type : String, set : setDefaultCover }, year : Number

});

gestion des erreurs dans la requˆ ete

// dans /controllers/books.js Books.create(newBook)

.then( newBook => res.status(200).json(newBook) ) .catch( error => res.status(400).json(error) );

(22)

traitement de la requˆ ete

cˆ ot´ e client... prise en compte de l’erreur

// dans /public/javascripts/create-book.js

fetch(’http://127.0.0.1:3000/books/create’, requestOptions) .then ( response => {

if (response.ok)

{ return response.json(); }

else { throw new Error(‘ creation failed ‘ ); } })

.then(book => result.textContent = ‘book with id ${book._id} created‘ ) .catch( error => result.textContent = ‘error : ${error.message}‘ );

Universit´e Lille – Sciences et Technologies - Licence mention Informatique javascript et son ´ecosyst`eme 22

(23)

gestion du message d’erreur

mongodb v4.2 exploitation de l’erreur fournie dans response

// dans /public/javascripts/create-book.js

fetch(’http://127.0.0.1:3000/books/create’, requestOptions) .then(response =>

response.json()

.then(json => ({ ok : response.ok, json : json}) ) .then( response => {

if (response.ok)

{ return response.json; } else

{ throw new Error(‘creation failed : ${response.json.message}‘);}

})

.then(book => result.textContent = ‘book with id ${book._id} created‘)) .catch( error => result.textContent = ‘error : ${error.message}‘ );

(24)

save() / cr´ eation de sous-document

mongodb v4.3 il faut cr´ eer le sous-document et sauvegarder le document parent le r´ esultat de save() est la totalit´ e du document parent

// dans /routes/books.js

router.post(’/adddetails/:bookId’, booksController.addDetails);

// dans /controllers/books.js const addDetails =

(req, res, err) => {

let details = { ...req.body }; // les donn´ees sont dans req.body Books.findById( req.params.bookId )

.then( book => {

book.details = details;

return book.save();

})

.then( book => res.status(200).json(book.details)) .catch( error => res.status(400).json(error) );

}

Universit´e Lille – Sciences et Technologies - Licence mention Informatique javascript et son ´ecosyst`eme 24

(25)

update()

mongodb v5 mise ` a jour d’un document

m´ ethode PUT

// dans /routes/books.js

router.get(’/update/:bookId’, booksController.updateForm );

router.put(’/update/:bookId’, booksController.update );

cˆ ot´ e client

// dans /public/javascripts/update-book.js const updateBook =

bookId => {

let newBook = { title : title.value, author : author.value, ... };

let body = JSON.stringify(newBook);

let requestOptions = { method :’PUT’, body : body,

headers: {"Content-Type""application/json"}};

fetch(‘http://127.0.0.1:3000/books/update/${bookId}‘, requestOptions) .then ( response => ...

(26)

cˆ ot´ e serveur

// dans /controllers/books.js const update =

(req,res,err) => {

let updatedBook = { ...req.body };

// Books.findById( req.params.bookId ).update(updatedBook) Books.findByIdAndUpdate( req.params.bookId, updatedBook )

.then( () => res.status(200).json({id : req.params.bookId}) ) .catch( error => res.status(400).json(error) );

}

findByIdAndUpdate(theId, thevalues, { new : true } ) permet d’avoir en r´ esultat le document apr` es modification

updateOne(), updateMany()

Universit´e Lille – Sciences et Technologies - Licence mention Informatique javascript et son ´ecosyst`eme 26

(27)

remove()

mongodb v6 suppression d’un document de la collection

// dans /routes/books.js

router.get(’/delete/:bookId’, booksController.delete );

// dans /controllers/books.js const deleteBook =

(req,res,err) => {

//Books.findById( req.params.bookId ).remove() Books.findByIdAndRemove( req.params.bookId )

.then( () => res.redirect(’/books’) ) .catch( error => { throw error } );

}

REST : utiliser la m´ ethode DELETE

deleteOne(), deleteMany()

(28)

API REST

m´ ethode utilisation Response POST Create new data nouvel objet cr´ e´ e

GET Read data objet r´ eponse de la requˆ ete PUT Update document objet mis ` a jour

DELETE Delete document null

// dans /routes/bookrest.js router.get(’/’, controller.home );

router.get( ’/:bookId’, controller.getBook );

router.post( ’/’, controller.createBook );

router.put( ’/:bookId’, controller.updateBook );

router.delete( ’/:bookId’, controller.deleteBook );

mongodb v7

Universit´e Lille – Sciences et Technologies - Licence mention Informatique javascript et son ´ecosyst`eme 28

(29)

// dans /controllers/bookrest.js const getBook =

(req,res) =>

Books.findById( req.params.bookId )

.then( book => res.status(200).json(book) );

const createBook = (req,res) => {

let newBook = { ...req.body };

Books.create(newBook)

.then( book => res.status(200).json(book) );

}

const updateBook = (req, res) => {

let updatedBook = { ...req.body };

Books.findByIdAndUpdate( req.params.bookId, updatedBook, { new : true } ) .then( book => res.status(200).json(book) );

}

const deleteBook = (req,res) =>

Books.findByIdAndRemove( req.params.bookId ) .then( () => res.status(200).end() );

(30)

ot´ e client

// dans /public/javascripts/usebookrest.js const getBook = bookId => {

fetch(‘http://127.0.0.1:3000/bookrest/${bookId}‘, { method :’GET’ }) .then( response => response.json() )

.then( book => ... ) ... } const createBook = () => {

let newBook = ...; let body = JSON.stringify(newBook);

let requestOptions = { method :’POST’, body : body , headers : ... };

fetch(‘http://127.0.0.1:3000/bookrest/‘, requestOptions) .then( response => response.json() )

.then( book => ... ) ... } const updateBook = bookId => {

let book = ...; let body = JSON.stringify(book);

let requestOptions = { method :’PUT’, body : body , headers : ... };

fetch(‘http://127.0.0.1:3000/bookrest/${bookId}‘, requestOptions) .then( response => response.json() )

.then( book => ... ) ... } const deleteBook = bookId => {

fetch(‘http://127.0.0.1:3000/bookrest/${bookId}‘, { method :’DELETE’ }) .then( () => ... ) ... }

Universit´e Lille – Sciences et Technologies - Licence mention Informatique javascript et son ´ecosyst`eme 30

Références

Documents relatifs

En particulier, l'ULCO dispose d'un serveur pédagogique avec des expériences de physique en ligne, des cours, etc….. L'étudiant est vivement invité à

10 avril 2017 ; dur´ ee : 1 heure 30 Documents, calculatrices et t´ el´ ephones interdits2. Il sera particuli` erement tenu compte du soin apport´ e ` a la

Actuellement, la mention offre 18 UE au premier semestre du M1 et 26 au second semestre 2 (dont une UE de traitement de signal est restreinte aux étudiants désirant

Le parcours en alternance de la spécialité Réseaux permet ainsi aux étudiants de partir en entreprise pendant la seconde vague du premier semestre, dont les enseignements, pour eux,

Le parcours en alternance de la spécialité Réseaux permet ainsi aux étudiants de partir en entreprise pendant la seconde vague du premier semestre, dont les enseignements, pour eux,

• Syntaxe pour mettre à jour un document dans une collection coll:. • <query> est un document utilisant des opérateurs

Un tweet peut également mentionner/s’adresser à des utilisateurs particuliers, qui sont alors directement cités dans le tweet ( @mention ).. La figure 2 montre un exemple

Considérons donc que les traitements souhaités visent à recommander des personnes à suivre, à récupérer le nombre de followers d’un utilisateur, à récupérer le nombre de