Sling Academy
Home/Node.js/Mongoose: Compare two dates in a query (before, after, between)

Mongoose: Compare two dates in a query (before, after, between)

Last updated: December 30, 2023

Introduction

Working with dates is a common task in web development, particularly when querying databases. Mongoose, a popular ORM for MongoDB in Node.js applications, provides tools for efficiently comparing dates.In this tutorial, we’ll explore how to compare two dates using Mongoose and MongoDB queries, with examples ranging from basic date comparisons to more complex scenarios.

Before you dive into comparing dates with Mongoose, ensure that you have the following prerequisites:

  • Node.js installed on your system.
  • Basic understanding of JavaScript or TypeScript.
  • Familiarity with MongoDB and Mongoose.

Setting Up the Environment

To get started, install Mongoose in your Node.js project:

npm install mongoose

Connect to your MongoDB database using the following code snippet:

import mongoose from 'mongoose';

mongoose.connect('mongodb://localhost:27017/myDatabase', {
  useNewUrlParser: true,
  useUnifiedTopology: true
});

Basic Date Comparison

Let’s begin with how to perform basic date comparisons such as finding documents before, after, or exactly on a specific date:

Finding Documents Before a Date

The following query finds documents where the dateField is before ‘2023-01-01’:

const results = await Model.find({
  dateField: { $lt: new Date('2023-01-01') }
});

Finding Documents After a Date

To find documents where the dateField is after a certain date, use the `$gt` operator:

const results = await Model.find({
  dateField: { $gt: new Date('2023-01-01') }
});

Finding Documents on a Specific Date

If you need to find documents with a dateField exactly on a specific date (ignoring time):

const startOfDay = new Date('2023-01-01');
startOfDay.setUTCHours(0, 0, 0, 0);

const endOfDay = new Date('2023-01-01');
endOfDay.setUTCHours(23, 59, 59, 999);

const results = await Model.find({
  dateField: {
    $gte: startOfDay,
    $lte: endOfDay
  }
});

Advanced Date Comparisons

For more complex use cases, we can compare dates between ranges, utilize aggregation frameworks, or work with time zones.

Finding Documents Between Dates

Here’s how to perform a query to find documents with dateField between ‘2023-01-01’ and ‘2023-02-01’:

const startDate = new Date('2023-01-01');
const endDate = new Date('2023-02-01');

const results = await Model.find({
  dateField: {
    $gte: startDate,
    $lte: endDate
  }
});

Using Aggregation for Date Comparisons

For more advanced queries, such as grouping by day, month or year, use the aggregation framework:

const results = await Model.aggregate([
  {
    $match: {
      dateField: {
        $gte: new Date('2023-01-01'),
        $lte: new Date('2023-02-01')
      }
    }
  },
  {
    $group: {
      _id: {
        year: { $year: '$dateField' },
        month: { $month: '$dateField' },
        day: { $dayOfMonth: '$dateField' }
      },
      count: { $sum: 1 }
    }
  }
]);

Handling Time Zones

When dealing with different time zones, you may need to adjust queries accordingly.
You can use libraries like `moment-timezone` or handle offsets manually.
For example, querying with time zone offset might look like this:

const TIMEZONE_OFFSET = -5; 

const startDate = new Date(new Date('2023-01-01').getTime() + TIMEZONE_OFFSET * 60 * 60 * 1000);
startDate.setUTCHours(0, 0, 0, 0);

const endDate = new Date(new Date('2023-01-02').getTime() + TIMEZONE_OFFSET * 60 * 60 * 1000);
endDate.setUTCHours(23, 59, 59, 999);

const results = await Model.find({
  dateField: {
    $gte: startDate,
    $lte: endDate
  }
});

Ensure that your date comparisons function as intended by writing tests and thoroughly debugging your queries. Adding logs and using GUIs like MongoDB Compass can help visualize and troubleshoot issues.

Conclusion

Comparing dates in Mongoose is a powerful feature that, when utilized correctly, can lead to efficient data retrieval. In this tutorial, we’ve covered how to query documents based on various date comparisons, tackling simple to complex date-related queries. By grasping these concepts, developers can handle time-sensitive data with greater confidence and precision.

Next Article: How to Set Unsigned Integer Field in Mongoose

Previous Article: Mongoose: Search documents by keywords (text search)

Series: Mongoose.js Tutorials

Node.js

You May Also Like

  • NestJS: How to create cursor-based pagination (2 examples)
  • Cursor-Based Pagination in SequelizeJS: Practical Examples
  • MongooseJS: Cursor-Based Pagination Examples
  • Node.js: How to get location from IP address (3 approaches)
  • SequelizeJS: How to reset auto-increment ID after deleting records
  • SequelizeJS: Grouping Results by Multiple Columns
  • NestJS: Using Faker.js to populate database (for testing)
  • NodeJS: Search and download images by keyword from Unsplash API
  • NestJS: Generate N random users using Faker.js
  • Sequelize Upsert: How to insert or update a record in one query
  • NodeJS: Declaring types when using dotenv with TypeScript
  • Using ExpressJS and Multer with TypeScript
  • NodeJS: Link to static assets (JS, CSS) in Pug templates
  • NodeJS: How to use mixins in Pug templates
  • NodeJS: Displaying images and links in Pug templates
  • ExpressJS + Pug: How to use loops to render array data
  • ExpressJS: Using MORGAN to Log HTTP Requests
  • NodeJS: Using express-fileupload to simply upload files
  • ExpressJS: How to render JSON in Pug templates