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")
    })
  }