Search⌘ K
AI Features

Creating the Data Access Object

Explore how to implement a data access object for movies in a Node.js backend using MongoDB. Learn to connect to the database, query movies with filters, and manage pagination efficiently. This lesson teaches you to structure backend code for reliable data retrieval in a MERN stack application.

In this lesson, we’ll implement the movies data access object to allow our code to access movie(s) from our database.

import express from 'express'
const router = express.Router() // get access to express router 
router.route('/').get((req,res) => res.send('hello world')) 
export default router
The initial files we will build on

Creating Data Access Objects

In the backend, let’s create a directory called dao (data access object). In dao, create the file moviesDAO.js with the following code:

Javascript (babel-node)
let movies
export default class MoviesDAO{
static async injectDB(conn){
if(movies){
return
}
try{
movies = await conn.db(process.env.MOVIEREVIEWS_NS)
.collection('movies')
}
catch(e){
console.error(`unable to connect in MoviesDAO: ${e}`)
}
}
}

Lines 1–3: The reference to the database is stored in movies. We then export the class MoviesDAO, which contains an async method injectDB. This method is called as soon as the server starts and provides the database reference to movies.

Line 4: If the reference already exists, the execution of the function is stopped.

Lines 7–10: If the reference doesn’t exist, we go ahead and connect to the database process.env.MOVIEREVIEWS_NS and the movies collection.

Lines 11–13: If we fail to get the reference, we send an error message to the console.

Retrieving movies

We now need to define the method to get all movies from the database. Add the code in the widget below to the moviesDAO.js file:

Javascript (babel-node)
static async getMovies({// default filter
filters = null,
page = 0,
moviesPerPage = 20, // will only get 20 movies at once
} = {}){
let query
if(filters){
if("title" in filters){
query = { $text: { $search: filters['title']}}
}else if("rated" in filters){
query = { "rated": { $eq: filters['rated']}}
}
}
let cursor
try{
cursor = await movies.find(query)
.limit(moviesPerPage)
.skip(moviesPerPage * page)
const moviesList = await cursor.toArray()
const totalNumMovies = await movies.countDocuments(query)
return {moviesList, totalNumMovies}
}
catch(e){
console.error(`Unable to issue find command, ${e}`)
return { moviesList: [], totalNumMovies: 0}
} }

Lines 1–5: The getMovies method accepts a filters object as its first argument and retrieves results on page 0 ...