MongoDB est une base de données NoSql. Elle stocke les données sous format JSON (BSON)
https://www.mongodb.com/cloud/atlas/signup
Outil pour visualiser notre database : https://www.mongodb.com/download-center/compass
Une fois inscrit sur le site, penser a rajouter un user et une adresse IP dans la whitelist
Puis on va cliquer sur connect et choisir pour application.
npm i --save mongodb
Dans util/database.js
const mongodb = require("mongodb");
const MongoClient = mongodb.MongoClient;
let _db;
const mongoConnect = (callback) => {
MongoClient.connect('mongodb+srv://6ssou:*******@cluster0-kkpzf.gcp.mongodb.net/shop?retryWrites=true&w=majority')
.then(client => {
console.log("connected!");
_db = client.db();
callback()
})
.catch(err => {
console.log(err)
throw err;
});
}
const getDb = () => {
if (_db) {
return _db
}
throw 'no database found!';
}
exports.mongoConnect = mongoConnect;
exports.getDb = getDb
// pour se connecter app.js :
const mongoConnect = require("./util/database").mongoConnect;
mongoConnect(() => {
app.listen(3000);
});
Nous allons modifier nos models pour les faire fonctionner avec mongodb au lieu de sequelize
// models/product.js
const getDb = require("../util/database").getDb;
class Product {
constructor(title, price, imageUrl, description) {
this.title = title;
this.price = price;
this.imageUrl = imageUrl;
this.description = description;
}
save() {
const db = getDb();
return db.collection('products').insertOne(this)
.then(result => {
console.log(result)
})
.catch(err => {
console.log(err)
});
}
}
module.exports = Product;
INSERT A PRODUCT
const Product = require('../models/product');
exports.postAddProduct = (req, res, next) => {
const title = req.body.title;
const imageUrl = req.body.imageUrl;
const price = req.body.price;
const description = req.body.description;
// create the new product based on the model/product.js
const product = new Product(title, price, imageUrl, description)
// call the save method
product.save()
.then(() => {
res.redirect('/admin/products');
})
.catch(err => {
console.log(err);
});
};
GET PRODUCTS
// models/products.js
static fetchAll() {
const db = getDb();
// find returns a cursor
return db.collection('products')
.find()
.toArray()
.then(products => {
console.log(products)
return products;
})
.catch(err => {
console.log(err)
})
}
// admin/admin.js
exports.getProducts = (req, res, next) => {
Product.fetchAll()
.then(products => {
res.render('admin/products', {
prods: products,
pageTitle: 'Admin Products',
path: '/admin/products'
});
})
.catch(err => console.log(err));
};
GET A PRODUCT BY ID :
// model/product.js
const mongodb = require("mongodb")
static findById(prodId) {
const db = getDb();
return db.collection('products')
// because id are stored differently
.find({_id: mongodb.ObjectID(prodId)})
// next to get the last document returned by find()
.next()
.then(product => {
console.log(product);
return product;
})
.catch(err => {
console.log(err)
})
}
EDIT A PRODUCT BY ID :
// model/products.js
static save() {
const db = getDb();
let dbOperation;
if (this._id) {
// update the product
dbOperation = db.collection("products")
.updateOne({ _id: new mongodb.ObjectId(this._id) },
{$set: this}
)
} else {
// insert it
dbOperation = db.collection('products').insertOne(this)
}
return dbOperation
.then(result => {
console.log(result)
})
.catch(err => {
console.log(err)
});
}
// controller/admin.js
const mongodb = require("mongodb")
const ObjectId = mongodb.ObjectId;
exports.postEditProduct = (req, res, next) => {
const prodId = req.body.productId;
const updatedTitle = req.body.title;
const updatedPrice = req.body.price;
const updatedImageUrl = req.body.imageUrl;
const updatedDesc = req.body.description;
const product = new Product(
updatedTitle,
updatedPrice,
updatedImageUrl,
updatedDesc,
new ObjectId(prodId)
)
product
.save()
.then(() => {
res.redirect('/admin/products');
})
.catch(err => console.log(err));
};
DELETE BY ID :
// models/product.js
static deleteById(prodId) {
const db = getDb();
return db.collection("products").deleteOne({_id: mongodb.ObjectId(prodId)})
.then(() => {
console.log("removed")
})
}