`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!
Did you find this tutorial useful? Say thanks by starring our repo on GitHub!