Connecting a Node.js Application to a Database (Using MongoDB)

As your web applications grow, storing and retrieving data becomes a critical part of the development process. In this module, we will explore how to integrate a MongoDB database with a Node.js application. MongoDB is a NoSQL database that is well-suited for web applications due to its flexibility, scalability, and ease of use.


Table of Contents

  1. Introduction to MongoDB and NoSQL
  2. Setting Up MongoDB
  3. Connecting Node.js to MongoDB with Mongoose
  4. Creating and Reading Documents
  5. Updating and Deleting Documents
  6. Querying MongoDB
  7. Handling Errors and Validation
  8. Conclusion

1. Introduction to MongoDB and NoSQL

MongoDB is a NoSQL (Not Only SQL) database that stores data in flexible, JSON-like documents. Unlike relational databases that use tables, MongoDB uses collections, which can store documents with different fields. This flexibility makes MongoDB ideal for dynamic and growing data sets.

MongoDB allows for horizontal scaling and high performance, making it an excellent choice for modern web applications, especially when your application requires a schema-less design.


2. Setting Up MongoDB

To get started with MongoDB, you can either set up a local instance of MongoDB on your computer or use a cloud-based service like MongoDB Atlas.

To install MongoDB locally, follow the official MongoDB installation guide for your platform:
MongoDB Installation Guide

If you’re using MongoDB Atlas, create an account, and create a new cluster. After that, get your connection URI, which you’ll need to connect your Node.js application to the database.


3. Connecting Node.js to MongoDB with Mongoose

Mongoose is an Object Data Modeling (ODM) library for MongoDB and Node.js. It simplifies the interaction with MongoDB by providing a higher-level abstraction, such as defining schemas and validating data.

First, install Mongoose:

npm install mongoose

Then, in your app.js file, you can connect to MongoDB like this:

const mongoose = require('mongoose');

mongoose.connect('mongodb://localhost/mydb', {
useNewUrlParser: true,
useUnifiedTopology: true
})
.then(() => console.log('Connected to MongoDB'))
.catch((err) => console.log('Could not connect to MongoDB...', err));

Replace 'mongodb://localhost/mydb' with your MongoDB Atlas URI if using the cloud service.


4. Creating and Reading Documents

Once connected, you can start interacting with MongoDB. To interact with MongoDB, you first need to define a Schema. A schema represents the structure of the documents within a collection.

Here’s an example of creating a simple user schema:

const mongoose = require('mongoose');

const userSchema = new mongoose.Schema({
name: String,
email: String,
age: Number,
});

const User = mongoose.model('User', userSchema);

// Create a new user
const newUser = new User({
name: 'John Doe',
email: '[email protected]',
age: 30,
});

newUser.save()
.then(() => console.log('User saved'))
.catch((err) => console.log('Error:', err));

// Reading users from the database
User.find()
.then((users) => console.log('Users:', users))
.catch((err) => console.log('Error:', err));

In this example:

  • We define a User model using a schema.
  • We create a new user and save it to the database.
  • We query all users from the database.

5. Updating and Deleting Documents

You can also update and delete documents in MongoDB using Mongoose methods such as updateOne(), updateMany(), and deleteOne().

Updating a document:

User.updateOne({ name: 'John Doe' }, { age: 31 })
.then(() => console.log('User updated'))
.catch((err) => console.log('Error:', err));

Deleting a document:

User.deleteOne({ name: 'John Doe' })
.then(() => console.log('User deleted'))
.catch((err) => console.log('Error:', err));

6. Querying MongoDB

Mongoose provides a powerful set of query methods to filter, sort, and limit data.

Find documents with a condition:

User.find({ age: { $gte: 18 } })
.then((users) => console.log('Adult Users:', users))
.catch((err) => console.log('Error:', err));

This query fetches users who are 18 years or older.

Sorting results:

User.find()
.sort({ age: -1 }) // Sorts by age in descending order
.then((users) => console.log('Users sorted by age:', users))
.catch((err) => console.log('Error:', err));

7. Handling Errors and Validation

Mongoose allows you to define validation rules for each field in your schema. These can ensure that the data being saved meets certain criteria (e.g., a required field, a valid email address).

const userSchema = new mongoose.Schema({
name: { type: String, required: true },
email: { type: String, required: true, match: /.+@.+\..+/ },
age: { type: Number, min: 18 },
});

const User = mongoose.model('User', userSchema);

In this example:

  • The name and email fields are required.
  • The email field must match a regular expression to validate email format.
  • The age field must be 18 or older.

You can also handle errors using try-catch blocks or then-catch syntax, as demonstrated previously.


8. Conclusion

Integrating a MongoDB database with a Node.js application is straightforward using Mongoose. This allows you to manage your data more effectively and leverage MongoDB’s powerful features, such as scalability and flexible document storage. With the ability to perform CRUD operations, validate data, and create complex queries, you’re now equipped to build dynamic, data-driven web applications.

In the next module, we will cover Authentication and Authorization in Node.js, which is a crucial part of most web applications. Stay tuned!