Sling Academy
Home/Node.js/What is the equivalent of SQL LIKE in Mongoose?

What is the equivalent of SQL LIKE in Mongoose?

Last updated: December 30, 2023

Introduction

In this comprehensive guide, we will uncover how to effectively perform pattern matching in Mongoose, which is akin to the SQL LIKE operator widely used in relational databases. SQL’s LIKE operator enables developers to search for a specified pattern in a column, greatly aiding in performing searches. Unlike SQL, Mongoose, which is the Object Data Modeling (ODM) library for MongoDB in Node.js, doesn’t have a LIKE operator per se. However, Mongoose supports the use of regular expressions that can replicate and even extend the functionality of SQL’s LIKE.

This tutorial will take you through various examples, starting with the basics of pattern matching in Mongoose, and iteratively advancing to more complex queries. By following along, you’ll grasp the principles of utilizing regular expressions in Mongoose for tasks akin to using the LIKE operator in SQL.

Setting the Stage

To proceed with this tutorial, it’s assumed that you have a basic understanding of Node.js, along with Mongoose installed in your application. For the examples provided, we will be using JavaScript ES6 syntax, async/await for handling asynchronous operations, and ES modules.

Firstly, ensure you have a simple Mongoose model to work with, as shown in this example:

import mongoose from 'mongoose';

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

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

Basic Pattern Matching with Regular Expressions

To begin, using regular expressions in Mongoose looks something like this code, which is analogous to the SQL LIKE ‘%pattern%’ operation:

// To find users whose names contain 'John', case insensitive
User.find({ name: /John/i })
  .then(users => {
    console.log(users);
  }).catch(err => {
    console.error(err);
  });

The /John/i is a regular expression where John is the pattern you’re searching for, and the i flag makes the search case-insensitive. This would be the starting point for pattern matching akin to ‘%John%’ using the SQL LIKE operator.

Mongoose ‘start with’ pattern

To find records that start with a specific pattern (the equivalent of ‘John%’ in SQL’s LIKE), you’d use the caret (^) character:

// Finds any records where the name starts with 'John'
User.find({ name: /^John/i })
  .then(...);

Mongoose ‘end with’ pattern

Conversely, if you’re interested in records that end with a certain pattern (similar to ‘%John’ with SQL LIKE), use the dollar sign ($):

// Finds records where the name ends with 'Doe', regardless of case
User.find({ name: /Doe$/i })
  .then(...);

Dynamic Pattern Matching

Static patterns aren’t always enough. Sometimes you need to build your regular expressions dynamically, similar to preparing a LIKE ‘%pattern%’ statement with variable patterns. In ECMAScript 6 (ES6), template literals make constructing such patterns straightforward:

const searchTerm = 'John';
User.find({ name: new RegExp(searchTerm, 'i') })
  .then(...);

Functions and Async/Await

As this guide emphasizes the latest syntax, let’s evolve the previous example into an async function using async/await:

async function findUsersByName(pattern) {
  try {
    const users = await User.find({
      name: new RegExp(pattern, 'i')
    });
    return users;
  } catch (err) {
    console.error(err);
  }
}

// Usage
findUsersByName('John').then(...);

Advanced Pattern Matching

Advanced usage involves combining multiple conditions, using complex regular expression patterns, and optimizing queries for better performance. The following depicts advanced pattern matching:

// Searching for users whose names either start with 'John' or end with 'Doe'
User.find({
  $or: [
    { name: /^John/i },
    { name: /Doe$/i }
  ]
})
.then(...);

Conclusion

While Mongoose, an ODM library for MongoDB, does not natively support SQL’s LIKE operator, it offers a robust alternative via regular expressions. This tutorial covered the equivalent of the SQL LIKE operator in Mongoose, moving from basic pattern matching to dynamic and advanced queries. By utilizing the powerful features of regular expressions combined with JavaScript and Mongoose best practices, you can craft sophisticated search functionalities rivaling those found in traditional SQL database implementations.

If you want to explore more about pattern matching in other scenarios using MongoDB and Mongoose, consider diving into topics such as indexing for performance, replicating other SQL operations, and learning more about MongoDB Atlas’s full-text search capability.

Next Article: Fixing Mongoose DeprecationWarning: mpromise

Previous Article: What is the equivalent of SQL ‘GROUP BY’ in Mongoose?

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