What is the equivalent of SQL LIKE in Mongoose?

Updated: December 30, 2023 By: Guest Contributor Post a comment

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.