On this page
Tracks

Get started with MongoDB

Last reviewed 2 Sept 2026

MongoDB is a NoSQL document database with the scalability and flexibility that you want with the querying and indexing that you need.. It stores data in a type of JSON format called BSON.

Install MongoDb in your machine or we can use mongoDB cloud as well

https://www.mongodb.com/docs/manual/administration/install-on-linux/

Linux commands:

sudo systemctl start mongod

sudo systemctl status mongod

mongosh

A collection is a grouping of MongoDB documents. Documents within a collection can have different fields. A collection is the equivalent of a table in a relational database system. A collection exists within a single database

Mongoose: Mongoose is an ODM (Object Data Modeling) library for MongoDB.

What is a schema?

A schema defines the structure of your collection documents. A Mongoose schema maps directly to a MongoDB collection.

npm i mongoose

Let;s install nodemon so that we do not need to restart again for the changes except module import part changes

npm i nodemon -D

Replace “start”: “node index” to “start”: “nodemon index” in the package.json

Connect MongoDB

const express = require("express");
const fs = require("fs");
const mongoose =require("mongoose");
const users = require("./MOCK_DATA.json");
const app = express();
const PORT = 8000;

//connect MongoDB

mongoose.connect('mongodb://127.0.0.1:27017/crud').then(()=>console.log("MongoDb connected")).catch( (err) => console.log(err))

//Schema

const userSchema = new mongoose.Schema({

firstName:{

type:String,

required:true

},

lastName:{

type:String,

},

email:{

type:String,

required:true,

unique:true

},

jobTitle:{

type:String,

},

gender:{

type:String,

}

})

//Model

const User = mongoose.model("user",userSchema)

//Middleware plugin

app.use(express.urlencoded({extended:false}))

// Middleware logger for requests

app.use((req, res, next) => {
fs.appendFile("log.txt",`\\n ${Date.now()} : ${req.method} : ${req.path}`, (error,result) =>{

next()

})

})

// routes

app.get("/users", (req, res)=>{
const html = `
    ${users.map( (user) => `<li>${user.first_name}</li>`).join("")}
`;
return res.send(html);

})

app.get("/api/users", (req, res)=>{
return res.json(users);

})

app.route("/api/users/:id")
.get((req, res)=>{
const id = Number(req.params.id);
const user= users.find( (user) => user.id === id);
return user ? res.json(user): res.json({"status":`No user found with id ${id}`});
}).patch((req, res) =>{
const id = Number(req.params.id);
const index= users.findIndex( (user) => user.id === id);

if (!users[index]) {

res.status(404).json({"status":`No user found with id ${id}`})
}
const body = req.body;
let new_user = {...users[index],...body};
users.splice(index,1,new_user);
fs.writeFile("./MOCK_DATA.json", JSON.stringify(users), (err, result) =>{
return res.json(new_user);

})

}).delete((req, res) =>{
const id = Number(req.params.id);
let index= users.findIndex( (user) => user.id === id);

if (!users[index]) {

res.status(404).json({"status":`No user found with id ${id}`})
}
users.splice(index,1);
// console.log(users);
fs.writeFile("./MOCK_DATA.json", JSON.stringify(users), (err, result) =>{
return res.status(200).json({"status":"Success", "id":id});

})

})

app.post("/api/users/", (req, res)=>{
const body = req.body;

if (!body || !body.first_name || !body.last_name || !body.email || !body.gender || !body.job_title) {

return res.status(400).json({message:"All fields are required."})
}

users.push({id:users.length+1, …body})

fs.writeFile("./MOCK_DATA.json",JSON.stringify(users), (error, result)=>{
return res.status(201).json({"status":"Success", "id":users.length});

})

})

app.listen(PORT, ()=> console.log("Server started at PORT",PORT))

CRUD operation using mongoose

const express = require("express");
const fs = require("fs");
const mongoose = require("mongoose");
const users = require("./MOCK_DATA.json");
const app = express();
const PORT = 8000;

//connect MongoDB

mongoose

.connect(“mongodb://127.0.0.1:27017/crud”)

.then(() => console.log("MongoDb connected"))
.catch((err) => console.log(err));

//Schema

const userSchema = new mongoose.Schema(

{

firstName: {
type: String,
required: true,

},

lastName: {
type: String,

},

email: {
type: String,
required: true,
unique: true,

},

jobTitle: {
type: String,

},

gender: {
type: String,

},

},

{ timestamps: true }

); // timestamps will automatically add createdAT and updatedAt field

//Model

const User = mongoose.model("user", userSchema);

//Middleware plugin

app.use(express.urlencoded({ extended: false }));

// Middleware logger for requests

app.use((req, res, next) => {

fs.appendFile(

“log.txt”,

`\n ${Date.now()} : ${req.method} : ${req.path}`,

(error, result) => {
next();
}
);
});

// routes

app.get("/users", async (req, res) => {
const allDBUsers = await User.find({});
const html = `
    ${allDBUsers.map((user) => `<li>${user.firstName}</li>`).join("")}
`;
return res.status(200).send(html);
});
app.get("/api/users", async (req, res) => {
const allDBUsers = await User.find({});
return res.status(200).json(allDBUsers);
});

app

.route(“/api/users/:id”)

.get(async (req, res) => {
try{
const user = await User.findById(req.params.id);

if (!user) {

return res.status(404).json({ status: `No user found with id ${req.params.id}` });
}
return res.status(200).json(user)

}catch(error){

return res.status(400).json({ message: `${err.reason}` });
}

})

.patch(async (req, res) => {
const body = req.body;
try{
const user = await User.findByIdAndUpdate(req.params.id, body);

if (!user) {

return res.status(404).json({ status: `No user found with id ${req.params.id}` });
}
return res.status(200).json(user);

}catch(err){

return res.status(400).json({ message: `${err.reason}` });
}

})

.delete(async (req, res) => {
try{
const user = await User.findByIdAndDelete(req.params.id);

if (!user) {

return res.status(404).json({ status: `No user found with id ${req.params.id}` });
}
return res.status(200).json({ message: "Success. User Deleted" });

}catch(error){

return res.status(400).json({ message: `${err.reason}` });
}
});
app.post("/api/users/", async (req, res) => {
const body = req.body;

if (

!body ||

!body.first_name ||

!body.last_name ||

!body.email ||

!body.gender ||

!body.job_title

) {

return res.status(400).json({ message: “All fields are required.” });

}
const result = await User.create({
firstName: body.first_name,
lastName: body.last_name,
email: body.email,
gender: body.gender,
jobTitle: body.job_title,
});
console.log(result);
return res.status(201).json({ message: "Success. User created" });
});
app.listen(PORT, () => console.log("Server started at PORT", PORT));

Model View Controller in NodeJS

We are following the model view controller pattern to restructure our crud app.

Create 4 folders

  • models: All models schemas
  • controllers: All routes handlers
  • views: HTML
  • routes: All routes path
  • middlewares: All middleware

index.js

const express = require("express");
const userRouter = require("./routes/users");
const { connectMongoDB} = require("./connection");
const { logReqRes } = require("./middlewares");
const app = express();
const PORT = 8000;
const url = "mongodb://127.0.0.1:27017/crud"
connectMongoDB(url).then( ()=> console.log("MongoDB connected")).catch( error => console.log(error));

//Middleware plugin

app.use(express.urlencoded({ extended: false }));

// Middleware logger for requests

app.use(logReqRes("log.txt"));

//routes

app.use("/api/users",userRouter)
app.listen(PORT, () => console.log("Server started at PORT", PORT));

connection.js

const mongoose = require("mongoose");
async function connectMongoDB(url){
return await mongoose.connect(url)
}
module.exports = {

connectMongoDB

}

controllers/user.js

const { User } = require("../models/users");
const handleGetAllUsers = async (req, res) => {
const allDBUsers = await User.find({});
return res.status(200).json(allDBUsers);
};
const handleGetUserById = async (req, res) => {
try {
const user = await User.findById(req.params.id);

if (!user) {

return res

.status(404)

.json({ status: `No user found with id ${req.params.id}` });
}
return res.status(200).json(user);

} catch (error) {

return res.status(400).json({ message: `${error.reason}` });
}
};
const handleUpdateUserById = async (req, res) => {
const body = req.body;
try {
const user = await User.findByIdAndUpdate(req.params.id, body);

if (!user) {

return res

.status(404)

.json({ status: `No user found with id ${req.params.id}` });
}
return res.status(200).json(user);

} catch (err) {

return res.status(400).json({ message: `${err.reason}` });
}
};
const handleDeleteUserById = async (req, res) => {
try {
const user = await User.findByIdAndDelete(req.params.id);

if (!user) {

return res

.status(404)

.json({ status: `No user found with id ${req.params.id}` });
}
return res.status(200).json({ message: "Success. User Deleted" });

} catch (error) {

return res.status(400).json({ message: `${err.reason}` });
}
};
const handleCreateUser = async (req, res) => {
const body = req.body;

if (

!body ||

!body.first_name ||

!body.last_name ||

!body.email ||

!body.gender ||

!body.job_title

) {

return res.status(400).json({ message: “All fields are required.” });

}
const result = await User.create({
firstName: body.first_name,
lastName: body.last_name,
email: body.email,
gender: body.gender,
jobTitle: body.job_title,
});
console.log(result);
return res.status(201).json({ message: "Success. User created", id: result._id });
};
module.exports = {

handleGetAllUsers,

handleGetUserById,

handleUpdateUserById,

handleDeleteUserById,

handleCreateUser

};

middlewares/index.js

const fs = require("fs");
function logReqRes(filename) {
return ((req, res, next) => {

fs.appendFile(

filename,

`\n ${Date.now()} : ${req.method} : ${req.path}`,

(error, result) => {
next();
}
);
});
}
module.exports ={

logReqRes

}

models/user.js

const mongoose = require("mongoose");

//Schema

const userSchema = new mongoose.Schema(

{

firstName: {
type: String,
required: true,

},

lastName: {
type: String,

},

email: {
type: String,
required: true,
unique: true,

},

jobTitle: {
type: String,

},

gender: {
type: String,

},

},

{ timestamps: true }

); // timestamps will automatically add createdAT and updatedAt field

//Model

const User = mongoose.model("user", userSchema);
module.exports = { User}

routes/user.js

const express = require("express");
const {

handleGetAllUsers,

handleGetUserById,

handleUpdateUserById,

handleDeleteUserById,

handleCreateUser,

} = require("../controllers/user");
const router = express.Router();
router.route("/").get(handleGetAllUsers).post(handleCreateUser);

router

.route(”/:id”)

.get(handleGetUserById)

.patch(handleUpdateUserById)

.delete(handleDeleteUserById);
module.exports = router;