Welcome to Day 11 of our Node.js blog series!😃
Today, we delve into connecting to databases, a crucial aspect of most web applications. We'll introduce databases in the context of Node.js, focus on using MongoDB—a popular NoSQL database—and set up Mongoose, an ODM (Object Data Modeling) library for MongoDB. We'll also demonstrate how to perform basic CRUD (Create, Read, Update, Delete) operations using Mongoose.
Introduction to Databases in Node.js
Databases are essential for storing and retrieving data in web applications. In the context of Node.js, you can connect to a variety of databases, including:
Relational Databases (SQL):
Examples: MySQL, PostgreSQL, SQLite
Data is stored in tables with relationships defined by foreign keys.
Structured Query Language (SQL) is used for data manipulation and querying.
NoSQL Databases:
Examples: MongoDB, Cassandra, Redis
Data is stored in various formats, such as key-value pairs, documents, or graphs.
They provide flexible schemas, making them suitable for applications with rapidly changing data structures.
Node.js, with its non-blocking I/O model, is well-suited for building high-performance, scalable applications that interact with databases. The choice between SQL and NoSQL databases depends on the application's requirements, such as data structure, scalability, and consistency needs.
Using MongoDB with Node.js
MongoDB is a document-oriented NoSQL database that stores data in JSON-like BSON (Binary JSON) format. It is known for its flexibility, scalability, and ease of use, making it a popular choice for modern web applications.
Setting Up MongoDB
To use MongoDB with Node.js, you need to:
Install MongoDB:
- You can download MongoDB from the official website and follow the installation instructions for your operating system.
Start the MongoDB Server:
Once installed, start the MongoDB server using the command:
mongod
This command starts the MongoDB daemon, which listens for connections on the default port 27017.
Install MongoDB Node.js Driver:
- Install the MongoDB Node.js driver to interact with MongoDB from your Node.js application.
npm install mongodb
Basic MongoDB Operations
Here's a basic example of connecting to MongoDB and performing some CRUD operations using the MongoDB driver.
const { MongoClient } = require('mongodb');
const url = 'mongodb://localhost:27017';
const dbName = 'myDatabase';
(async function() {
const client = new MongoClient(url, { useUnifiedTopology: true });
try {
await client.connect();
console.log('Connected to MongoDB');
const db = client.db(dbName);
const collection = db.collection('myCollection');
// Create: Insert a document
const insertResult = await collection.insertOne({ name: 'John Doe', age: 30 });
console.log('Inserted document:', insertResult.insertedId);
// Read: Find a document
const findResult = await collection.findOne({ name: 'John Doe' });
console.log('Found document:', findResult);
// Update: Update a document
const updateResult = await collection.updateOne({ name: 'John Doe' }, { $set: { age: 31 } });
console.log('Updated document count:', updateResult.modifiedCount);
// Delete: Delete a document
const deleteResult = await collection.deleteOne({ name: 'John Doe' });
console.log('Deleted document count:', deleteResult.deletedCount);
} catch (err) {
console.error(err);
} finally {
await client.close();
}
})();
Explanation:
We import the
MongoClient
class from themongodb
package.We define the MongoDB connection URL and the database name.
The
client.connect()
method connects to the MongoDB server.We perform CRUD operations on the
myCollection
collection in themyDatabase
database.
Setting Up Mongoose for MongoDB
Mongoose is an Object Data Modeling (ODM) library for MongoDB and Node.js. It provides a schema-based solution to model data, enforce schema validation, and interact with MongoDB in a more structured and convenient way.
Installing Mongoose
First, install Mongoose using npm:
npm install mongoose
Connecting to MongoDB with Mongoose
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/myDatabase', {
useNewUrlParser: true,
useUnifiedTopology: true
}).then(() => {
console.log('Connected to MongoDB with Mongoose');
}).catch(err => {
console.error('Connection error', err);
});
Explanation:
We import Mongoose and connect to the MongoDB database.
The
useNewUrlParser
anduseUnifiedTopology
options are set to use the new URL parser and the new server discovery and monitoring engine, respectively.
Defining Schemas and Models
In Mongoose, a Schema defines the structure of the documents within a collection, including the fields and their data types. A Model provides an interface to the database for creating, reading, updating, and deleting records.
const userSchema = new mongoose.Schema({
name: { type: String, required: true },
age: { type: Number, required: true },
email: { type: String, required: true, unique: true }
});
const User = mongoose.model('User', userSchema);
Explanation:
We define a
userSchema
with fieldsname
,age
, andemail
, along with their data types and validation rules.We create a
User
model based on the schema, which will represent theusers
collection in the database.
Performing Basic CRUD Operations with Mongoose
Create (Insert):
To create a new document in the collection, instantiate the model and save it.
const newUser = new User({ name: 'Alice', age: 25, email: 'alice@example.com' }); newUser.save().then(user => { console.log('User saved:', user); }).catch(err => { console.error('Error saving user:', err); });
Explanation:
- We create a new
User
instance and callsave()
to insert it into the database.
- We create a new
Read (Find):
To retrieve documents, use the
find
,findOne
, or similar methods.User.find({ age: { $gte: 18 } }).then(users => { console.log('Users found:', users); }).catch(err => { console.error('Error finding users:', err); }); User.findOne({ email: 'alice@example.com' }).then(user => { console.log('User found:', user); }).catch(err => { console.error('Error finding user:', err); });
Explanation:
find
retrieves all users with age greater than or equal to 18.findOne
retrieves the first user with the specified email.
Update:
To update a document, use
updateOne
,updateMany
, orfindByIdAndUpdate
.User.updateOne({ email: 'alice@example.com' }, { age: 26 }).then(result => { console.log('Update result:', result); }).catch(err => { console.error('Error updating user:', err); });
Explanation:
updateOne
updates the age of the user with the specified email.
Delete:
To delete documents, use
deleteOne
,deleteMany
, orfindByIdAndDelete
.User.deleteOne({ email: 'alice@example.com' }).then(result => { console.log('Delete result:', result); }).catch(err => { console.error('Error deleting user:', err); });
Explanation:
deleteOne
deletes the user with the specified email.
Conclusion
In this post, we've covered the essentials of connecting to databases in Node.js, focusing on MongoDB and Mongoose. We discussed setting up MongoDB, performing basic CRUD operations, and leveraging Mongoose for schema modeling and database interaction. Understanding these concepts is crucial for building robust, data-driven applications.
In our next post, we'll explore about using SQL Databases with Node.js. Stay tuned for more in-depth Node.js content!