`find()` with LIKE in Mongoose

Jun 5, 2020

The SQL LIKE operator lets you search for strings with wildcards. MongoDB doesn't have a similar operator - the $text operator performs a more sophisticated text search. But MongoDB does support regular expression queries that work similarly to LIKE.

For example, suppose you want to find all users whose email contains gmail. You can simply search by the JavaScript regular expression /gmail/:

const User = mongoose.model('User', mongoose.Schema({
  email: String
}));

await User.create([
  { email: 'sergei@google.com' },
  { email: 'bill@microsoft.com' },
  { email: 'test@gmail.com' },
  { email: 'gmail@google.com' }
]);

const docs = await User.find({ email: /gmail/ });
docs.length; // 2
docs.map(doc => doc.email).sort(); // ['gmail@google.com', 'test@gmail.com']

Equivalently, you can use the $regex operator.

const docs = await User.find({ email: { $regex: 'gmail' } });

Note that Mongoose does not escape special characters in regexps for you. If you want to use $regexp with user entered data, you should sanitize the string first using escape-string-regexp or a similar library for escaping regular expression special characters.

const escapeStringRegexp = require('escape-string-regexp');
const User = mongoose.model('User', mongoose.Schema({
  email: String
}));

await User.create([
  { email: 'sergey@google.com' },
  { email: 'bill@microsoft.com' },
  { email: 'test+foo@gmail.com' }
]);

const $regex = escapeStringRegexp('+foo');
const docs = await User.find({ email: { $regex } });

docs.length; // 1
docs[0].email; // 'test+foo@gmail.com'

// Throws: MongoError: Regular expression is invalid: nothing to repeat
await User.find({ email: { $regex: '+foo' } });

Want to become your team's MongoDB expert? "Mastering Mongoose" distills 8 years of hard-earned lessons building Mongoose apps at scale into 153 pages. That means you can learn what you need to know to build production-ready full-stack apps with Node.js and MongoDB in a few days. Get your copy!

More Mongoose Tutorials