You are on page 1of 21

CFGS DAM - DEPARTAMENT DE

M4: LLENGUATGES DE MARQUES INFORMÀTICA


CURS 2023 / 2024
Projecte JS4 NoSQL – MongoDB + Mongoose

Projecte JS4 NoSQL:MongoDB +


Mongoose
Índex
INTRODUCCIÓ...................................................................................................................................2
ENUNCIAT..........................................................................................................................................2
INSTAL·LACIÓ DE MONGODB.......................................................................................................2
MONGOOSE i MODELS....................................................................................................................3
Connexió amb la BD i extracció de dades.......................................................................................4
Setup dels models: Schematypes.....................................................................................................4
Identificadors: _id............................................................................................................................5
Naming convention..........................................................................................................................5
Exemple 1 definició i importació d’un model.................................................................................5
Exemple 2 definició i ‘us d'un model..............................................................................................6
Ús dels models: cerca amb find.......................................................................................................6
Ús dels models: creacio amb create() + actualització amb findOneAndUpdate ()..........................8
Ús dels models: esborrat amb deleteOne ().....................................................................................9
JAVASCRIPT MODERN 1: arrow functions.....................................................................................10
JAVASCRIPT MODERN 2: async/await...........................................................................................11
Problema de codi asíncron: Callback Hell.....................................................................................11
Solució 1: Promises (fent servir el .then i el .catch)......................................................................11
COM HO FEM NOSALTRES..................................................................................................11
Solució 2 async/await + promises:.................................................................................................12
Solució 3: await/async + arrow functions......................................................................................12
Solució 4: Com fer-ho correctament: models + await/async + arrow functions...........................13
Altres exemples: Promises + models (sense arrow functions)......................................................14
CONSIDERACIONS TÈCNIQUES DE LA PRÀCTICA.................................................................14
POSSIBLES ERRORS.......................................................................................................................15
ERROR DE DIMONI NO ENGEGAT..........................................................................................15
SOLUCIÓ......................................................................................................................................16
EXPORTACIÓ DE LA BD................................................................................................................16
AVALUACIÓ.....................................................................................................................................18

1/21
CFGS DAM - DEPARTAMENT DE
M4: LLENGUATGES DE MARQUES INFORMÀTICA
CURS 2023 / 2024
Projecte JS4 NoSQL – MongoDB + Mongoose

INTRODUCCIÓ
Ara que tenim l’aplicació gairebé muntada és el moment de passar d’una Base de dades
relacional com és SQLite a una de tipus NoSQL com és Mongo DB.
La BD es pot hostejar en local (https://www.mongodb.com/docs/manual/installation/) o
online (https://www.mongodb.com/). En aquesta pràctica farem servir la opció local.

ENUNCIAT
S’ha de:
1. Instal·lar MongoDB en local
2. Crear una BD o s’han d’afegir a mà les dades inicials i on aniran les futures dades
que els usuaris afegeixin
3. Accedir a la vostra aplicació fent servir mongoose

INSTAL·LACIÓ DE MONGODB
Haureu de seguir les passes del Moodle per :
1. instal·lar MongoDB en local
2. (opcional) instal·lar compass que és un client GUI de MongoDB , ja sigui online o
local
https://www.mongodb.com/docs/manual/installation/
3. engegar el dimoni de MongoDB amb sysctl:

4. crear la base de dades inicial


Atenció: cal ser root per instal·lar i per engegar el dimoni.

2/21
CFGS DAM - DEPARTAMENT DE
M4: LLENGUATGES DE MARQUES INFORMÀTICA
CURS 2023 / 2024
Projecte JS4 NoSQL – MongoDB + Mongoose

MONGOOSE i MODELS
Un ORM (object relational mapper) és un model de programació per accedir a una base
de dades. Mongoose és un ORM per accedir a BBDD de tipus NoSQL com és MongoDB
En comptes de fer servir SQL, un ORM accedeix mitjançant objectes de forma que cada
taula de la BD està representada per un model. Aquest model és una classe del ORM
L’accés a al BD es fa mitjançant els models, generalment amb la sintaxi Model.funció() per
exemple si tenim els models Group (que representa la taula groups) i Album (que
representa la taula albums)
const filter = {name:’acdc’)
const groups = Group.find( filter ) // retorna els grups amb name=’acdc’
const album = Album.findOneAndUpdate( filter, options )

3/21
CFGS DAM - DEPARTAMENT DE
M4: LLENGUATGES DE MARQUES INFORMÀTICA
CURS 2023 / 2024
Projecte JS4 NoSQL – MongoDB + Mongoose

Connexió amb la BD i extracció de dades


Cal definir la connexió amb mongoose.connect('mongodb://IP/DB') en aquest cas
mongoose.connect('mongodb://localhost/Musica')

Setup dels models: Schematypes


Els models es defineixen cadascú en un arxiu i depenen d’un esquema.
Aquí teniu els tipus de dades de l'esquema:
https://mongoosejs.com/docs/schematypes.html
L’únic que cal és importar mongoose i exportar el model creat amb
mongoose.model(nom_del_model, dadesDelSchema)
Després al app.js cal importar-ho amb require i el seu path (generalment es posen a dins
del directori models)

4/21
CFGS DAM - DEPARTAMENT DE
M4: LLENGUATGES DE MARQUES INFORMÀTICA
CURS 2023 / 2024
Projecte JS4 NoSQL – MongoDB + Mongoose

Identificadors: _id
Atenció que els camps de tipus id canvien respecte al clàssic. Ara es diuen _id i no són
de tipus integer sinó ObjectId. Al igual que amb moltes BBDD és el SGBD (sistema
gestor de base de dades), en aquest cas MongoDB, qui els gestiona. No els hem de crear.
Si tenim un foreign key cal definir-ho del tipus

Naming convention

La convenció de noms del model és:

Nom de la taula (minúscula i plural) Nom del model (Majúscula i singular)


groups Group
albums Album

La convenció de noms del foreign key és:

identificadors Foreign keys


_id nomTaulaForània_id
Exemple taula album Exemple foreign key cap a la taula
groups
_id: no es defineix . És automàtic. EL group_id: de tipus
gestiona mongoose

Exemple 1 definició i importació d’un model


Exemple del model d’un album amb un foreign key cap a la taula groups: observeu que es
diu album_id i es del tipus mencionat abans

5/21
CFGS DAM - DEPARTAMENT DE
M4: LLENGUATGES DE MARQUES INFORMÀTICA
CURS 2023 / 2024
Projecte JS4 NoSQL – MongoDB + Mongoose

Exemple 2 definició i ús d'un model

Ús dels models: cerca amb find


https://masteringjs.io/tutorials/mongoose/find Aquí fan servir sort() després de la cerca per
ordenar els resultats, però no és obligatori

6/21
CFGS DAM - DEPARTAMENT DE
M4: LLENGUATGES DE MARQUES INFORMÀTICA
CURS 2023 / 2024
Projecte JS4 NoSQL – MongoDB + Mongoose

7/21
CFGS DAM - DEPARTAMENT DE
M4: LLENGUATGES DE MARQUES INFORMÀTICA
CURS 2023 / 2024
Projecte JS4 NoSQL – MongoDB + Mongoose

Ús dels models: creacio amb create() + actualització


amb findOneAndUpdate ()
Extret de https://mongoosejs.com/docs/tutorials/findoneandupdate.html

8/21
CFGS DAM - DEPARTAMENT DE
M4: LLENGUATGES DE MARQUES INFORMÀTICA
CURS 2023 / 2024
Projecte JS4 NoSQL – MongoDB + Mongoose

Ús dels models: esborrat amb deleteOne ()

9/21
CFGS DAM - DEPARTAMENT DE
M4: LLENGUATGES DE MARQUES INFORMÀTICA
CURS 2023 / 2024
Projecte JS4 NoSQL – MongoDB + Mongoose

JAVASCRIPT MODERN 1: arrow functions


A javascript fem servir molt les funcion anònimes. Aquelles que no cal que tinguin nom:
Opció 1 posant nom:
function processaPeticio (req, res) { }
app.get('/api/groups/', processaPeticio);

Opció 2 funció anònima: no cal un nom perquè només es fa servir aquí


app.get('/api/groups/', function (req, res) {
...
..
});
Opció 3 arrow functions: mes semàntiques (a més a més d’altres beneficis)
app.get('/api/groups/', (req, res) => {
...
..
})

Més tutorials:
https://www.w3schools.com/Js/js_arrow_function.asp

10/21
CFGS DAM - DEPARTAMENT DE
M4: LLENGUATGES DE MARQUES INFORMÀTICA
CURS 2023 / 2024
Projecte JS4 NoSQL – MongoDB + Mongoose

JAVASCRIPT MODERN 2: async/await


Amb node tot hauria de ser asíncron per a no aturar l’únic fil d’execució. Si estem llegint
un arxiu , o esperant un accés a una URL o a la BD, que són processos que no se sap
quant poden trigar, el programa no s’hauria d’aturar. Hauria de continuar i oferir un
mecanisme per a saber què fer quan aquella operació hagi acabat.
Històricament això es feia amb callbacks, una funció que s'executa en acabar la operació
requerida que podria ser molt llarga (accés a BD, a arxius, a internet per carregar un
JSON etc)

Problema de codi asíncron: Callback Hell


El javascript clàssic de node tenia un problema anomenat Callback Hell i era similar al que
es produeix en obrir un arxiu (extret de: https://barcelonageeks.com/que-es-callback-hell-
y-como-evitarlo-en-node-js/).

Solució 1: Promises (fent servir el .then i el .catch)

var fs = require('fs');
const fsPromises = require('fs').promises;
fs.promises.readFile("input.txt") // retorna un Promise
.then(function (data) {
console.log("" + data);
})
.catch(function (error) {
console.log(error);
})

COM HO FEM NOSALTRES


app.get('/api/groups/', function (req, res) {
db.select('g.id', 'g.name')
.from('Groups as g')
.then(function (data) {

11/21
CFGS DAM - DEPARTAMENT DE
M4: LLENGUATGES DE MARQUES INFORMÀTICA
CURS 2023 / 2024
Projecte JS4 NoSQL – MongoDB + Mongoose

data = {'groups':data}
res.json(data);
}).catch(function (error) {
console.log(error)

});
});

Solució 2 async/await + promises:

Solució 3: await/async + arrow functions

L’ús de const és per la performance.

12/21
CFGS DAM - DEPARTAMENT DE
M4: LLENGUATGES DE MARQUES INFORMÀTICA
CURS 2023 / 2024
Projecte JS4 NoSQL – MongoDB + Mongoose

Solució 4: Com fer-ho correctament: models +


await/async + arrow functions

13/21
CFGS DAM - DEPARTAMENT DE
M4: LLENGUATGES DE MARQUES INFORMÀTICA
CURS 2023 / 2024
Projecte JS4 NoSQL – MongoDB + Mongoose

Altres exemples: Promises + models (sense arrow


functions)

CONSIDERACIONS TÈCNIQUES DE LA PRÀCTICA


No pot ser online
Només es pot fer servir:
1. find()
2. findOneAndUpdate()
3. deleteOne()
No es pot fer servir put com a verb HTTP del CRUD
No es pot fer servir status al response

14/21
CFGS DAM - DEPARTAMENT DE
M4: LLENGUATGES DE MARQUES INFORMÀTICA
CURS 2023 / 2024
Projecte JS4 NoSQL – MongoDB + Mongoose

POSSIBLES ERRORS
Cal parar atenció al dimoni de MongoDB. Si no està engegat cal engegar-lo

ERROR DE DIMONI NO ENGEGAT

15/21
CFGS DAM - DEPARTAMENT DE
M4: LLENGUATGES DE MARQUES INFORMÀTICA
CURS 2023 / 2024
Projecte JS4 NoSQL – MongoDB + Mongoose

SOLUCIÓ
Comprovar l’estat del dimoni i si no està engegat engegar-lo

EXPORTACIÓ DE LA BD
De vegades cal exportar la BD per fer una migració. (En mongo online es fa igual)

16/21
CFGS DAM - DEPARTAMENT DE
M4: LLENGUATGES DE MARQUES INFORMÀTICA
CURS 2023 / 2024
Projecte JS4 NoSQL – MongoDB + Mongoose

Se seleccionen tots els camps

posar nom

17/21
CFGS DAM - DEPARTAMENT DE
M4: LLENGUATGES DE MARQUES INFORMÀTICA
CURS 2023 / 2024
Projecte JS4 NoSQL – MongoDB + Mongoose

AVALUACIÓ
La nostra aplicació està dirigida a essers humans i per tant es valora MOLT la presentació
Suspès nota màxima 4:
• 1 única taula
• 2 taules no lligades (dues taules sense control de foreign keys)
• S’accedeix amb un altre ORM que no sigui mongoose en local
• No es fa servir mongoose + models
• No s’entrega l’exportació de les col·leccions (de les taules)
Nota màxima 5
• formulari de contacte
• info de autor/a
• api doc
Nota màxima 6
• Per el control de les foreign key no hi ha un select i l’usuari ha de posar ids
• no es fan servir arrow functions

18/21
CFGS DAM - DEPARTAMENT DE
M4: LLENGUATGES DE MARQUES INFORMÀTICA
CURS 2023 / 2024
Projecte JS4 NoSQL – MongoDB + Mongoose

Nota màxima 7
• Sí es fan servir arrow functions
• Hi ha un select per introduir les foreign keys
• No es mostra el id del foreing key sinó una dada.
Exemple:

Dades a MongoDB
Group (_id,name)
{_id:1F3GAS, name: metallica}

Album (_id,title,group_id)
{_id:8SHD45,title:black, group_id: 1F3GAS}

La vostra web
Album list
_id Title Group
8SHD45 black Metallica OK
8SHD45 black 1F3GAS NO

• No es fa servir async-await
Nota màxima 8
• Si es fa servir async-await

Modificadors
• update a totes les taules +1p
• Datatables funcionant correctament a cada taula +0.5p
• API doc amb swagger (https://swagger.io/) +0.5p
• Notificacions d’alertes tipus estàs segur al modificar i esborrar (cal tenir fet Update)
+0.5 opcions:
◦ notistack: https://notistack.com/features/basic
◦ notiflix: https://notiflix.github.io/

19/21
CFGS DAM - DEPARTAMENT DE
M4: LLENGUATGES DE MARQUES INFORMÀTICA
CURS 2023 / 2024
Projecte JS4 NoSQL – MongoDB + Mongoose

◦ noty: https://ned.im/noty/#/
S’entrega la carpeta node_modules: - 1p (NO cal entregar-la, esborreu-la abans )

20/21
CFGS DAM - DEPARTAMENT DE
M4: LLENGUATGES DE MARQUES INFORMÀTICA
CURS 2023 / 2024
Projecte JS4 NoSQL – MongoDB + Mongoose

ENTREGA
• Carpeta principal lestevesinicials
◦ carpeta BD amb el resultat d’exportar totes les col·leccions
▪ albums.json
▪ groups.json
◦ carpeta projecte: el projecte sencer de webstorm comprimit com a NOSQL-
lestevesincials.
• Si el format NO és tar gzip, si no es pot descomprimir o si està buit es baixarà la
nota (MB→ B, B→ CO, CO→ INS, INS→ DEF). És responsabilitat vostra una
vegada apujada l’entrega baixar-la i veure si es pot descomprimir i no està buida
• Us recordo que el fet que un arxiu es digui .tgz o .tar.gz no vol dir que aquest sigui
el seu format El que es farà abans de corregir serà fer servir el comandament file:

21/21

You might also like