En aquest tema, aprendrem a utilitzar MongoDB, una base de dades NoSQL, amb Mongoose, una biblioteca de modelatge d'objectes per Node.js que proporciona una solució elegant per treballar amb MongoDB. Mongoose facilita la definició d'esquemes per als nostres documents MongoDB i proporciona una API per interactuar amb la base de dades.
Continguts
Introducció a MongoDB i Mongoose
MongoDB
MongoDB és una base de dades NoSQL orientada a documents que emmagatzema dades en documents BSON (una extensió binària de JSON). És coneguda per la seva escalabilitat i flexibilitat.
Mongoose
Mongoose és una biblioteca de Node.js que proporciona una solució basada en esquemes per modelar les dades de l'aplicació. Ofereix validació, càlculs, middleware i altres funcionalitats per facilitar el treball amb MongoDB.
Instal·lació de MongoDB i Mongoose
Instal·lació de MongoDB
Per instal·lar MongoDB, segueix les instruccions de la documentació oficial de MongoDB.
Instal·lació de Mongoose
Per instal·lar Mongoose, utilitza npm (Node Package Manager):
Connexió a MongoDB
Per connectar-nos a una base de dades MongoDB amb Mongoose, primer hem de requerir el mòdul mongoose
i després utilitzar el mètode connect
per establir la connexió.
const mongoose = require('mongoose'); mongoose.connect('mongodb://localhost:27017/nombredb', { useNewUrlParser: true, useUnifiedTopology: true }).then(() => { console.log('Connexió a MongoDB establerta'); }).catch((error) => { console.error('Error connectant a MongoDB:', error); });
Definició d'Esquemes i Models
Esquema
Un esquema en Mongoose defineix l'estructura dels documents dins d'una col·lecció, especificant els camps i els seus tipus.
const Schema = mongoose.Schema; const usuariSchema = new Schema({ nom: { type: String, required: true }, edat: { type: Number, required: true }, email: { type: String, required: true, unique: true } });
Model
Un model és una classe que ens permet interactuar amb els documents d'una col·lecció. Es crea a partir d'un esquema.
Operacions CRUD amb Mongoose
Crear
Per crear un nou document, utilitzem el mètode save
del model.
const nouUsuari = new Usuari({ nom: 'Joan', edat: 30, email: '[email protected]' }); nouUsuari.save().then((resultat) => { console.log('Usuari creat:', resultat); }).catch((error) => { console.error('Error creant usuari:', error); });
Llegir
Per llegir documents, utilitzem el mètode find
.
Usuari.find().then((usuaris) => { console.log('Usuaris trobats:', usuaris); }).catch((error) => { console.error('Error llegint usuaris:', error); });
Actualitzar
Per actualitzar un document, utilitzem el mètode findByIdAndUpdate
.
Usuari.findByIdAndUpdate('id_usuari', { edat: 31 }, { new: true }).then((usuariActualitzat) => { console.log('Usuari actualitzat:', usuariActualitzat); }).catch((error) => { console.error('Error actualitzant usuari:', error); });
Eliminar
Per eliminar un document, utilitzem el mètode findByIdAndDelete
.
Usuari.findByIdAndDelete('id_usuari').then((usuariEliminat) => { console.log('Usuari eliminat:', usuariEliminat); }).catch((error) => { console.error('Error eliminant usuari:', error); });
Exercicis Pràctics
Exercici 1: Crear un Model de Producte
- Defineix un esquema per a un producte amb els següents camps: nom, preu, categoria.
- Crea un model a partir de l'esquema.
- Crea i desa un nou producte.
Exercici 2: Llegir i Actualitzar Productes
- Llegeix tots els productes de la base de dades.
- Actualitza el preu d'un producte específic.
Exercici 3: Eliminar Productes
- Elimina un producte de la base de dades.
Solucions
Solució Exercici 1
const producteSchema = new Schema({ nom: { type: String, required: true }, preu: { type: Number, required: true }, categoria: { type: String, required: true } }); const Producte = mongoose.model('Producte', producteSchema); const nouProducte = new Producte({ nom: 'Ordinador', preu: 1000, categoria: 'Electrònica' }); nouProducte.save().then((resultat) => { console.log('Producte creat:', resultat); }).catch((error) => { console.error('Error creant producte:', error); });
Solució Exercici 2
Producte.find().then((productes) => { console.log('Productes trobats:', productes); }).catch((error) => { console.error('Error llegint productes:', error); }); Producte.findByIdAndUpdate('id_producte', { preu: 1200 }, { new: true }).then((producteActualitzat) => { console.log('Producte actualitzat:', producteActualitzat); }).catch((error) => { console.error('Error actualitzant producte:', error); });
Solució Exercici 3
Producte.findByIdAndDelete('id_producte').then((producteEliminat) => { console.log('Producte eliminat:', producteEliminat); }).catch((error) => { console.error('Error eliminant producte:', error); });
Conclusió
En aquest tema, hem après a utilitzar MongoDB amb Mongoose per gestionar les nostres dades de manera eficient. Hem vist com connectar-nos a una base de dades, definir esquemes i models, i realitzar operacions CRUD. Amb aquests coneixements, estem preparats per treballar amb bases de dades NoSQL en les nostres aplicacions Node.js.
Curs de Node.js
Mòdul 1: Introducció a Node.js
Mòdul 2: Conceptes Bàsics
Mòdul 3: Sistema de Fitxers i I/O
Mòdul 4: HTTP i Servidors Web
Mòdul 5: NPM i Gestió de Paquets
Mòdul 6: Framework Express.js
- Introducció a Express.js
- Configuració d'una Aplicació Express
- Middleware
- Routing en Express
- Gestió d'Errors
Mòdul 7: Bases de Dades i ORMs
- Introducció a les Bases de Dades
- Utilitzar MongoDB amb Mongoose
- Utilitzar Bases de Dades SQL amb Sequelize
- Operacions CRUD
Mòdul 8: Autenticació i Autorització
Mòdul 9: Proves i Depuració
- Introducció a les Proves
- Proves Unitàries amb Mocha i Chai
- Proves d'Integració
- Depuració d'Aplicacions Node.js
Mòdul 10: Temes Avançats
Mòdul 11: Desplegament i DevOps
- Variables d'Entorn
- Utilitzar PM2 per a la Gestió de Processos
- Desplegar a Heroku
- Integració i Desplegament Continu