$regexMatch (aggregation)
Definition
New in version 4.2.
Performs a regular expression (regex) pattern matching and returns:
true
if a match exists.false
if a match doesn’t exist.MongoDB uses Perl compatible regular expressions (i.e. “PCRE” )version 8.41 with UTF-8 support.
Prior to MongoDB 4.2, aggregation pipeline can only use the queryoperator $regex
in the $match
stage. For moreinformation on using regex in a query, see $regex
.
Syntax
The $regexMatch
operator has the following syntax:
- { $regexMatch: { input: <expression> , regex: <expression>, options: <expression> } }
Field | Description | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
input | The string on which you wish to apply the regex pattern.Can be a string or any valid expression that resolves to a string. | ||||||||||
regex | The regex pattern to apply. Can be any valid expression that resolves to either a string or regexpattern /<pattern>/ . When using the regex /<patthern>/ , youcan also specify the regex options i and m (but not thes or x options):- "pattern" - /<pattern>/ - /<pattern>/<options> Alternatively, you can also specify the regex options with theoptions field. To specify the s or x options, youmust use the options field.You cannot specify options in both the regex and the options field. | ||||||||||
options | Optional. The following <options> are available for usewith regular expression.NoteYou cannot specify options in both the regex and theoptions field.
|
Returns
The operator returns a boolean:
true
if a match exists.false
if a match doesn’t exist.
See also
Behavior
$regexMatch and Collation
$regexMatch
ignores the collation specified for thecollection, db.collection.aggregate()
, and the index, if used.
For example, the create a sample collection with collation strength1
(i.e. compare base character only and ignore other differencessuch as case and diacritics):
- db.createCollection( "myColl", { collation: { locale: "fr", strength: 1 } } )
Insert the following documents:
- db.myColl.insertMany([
- { _id: 1, category: "café" },
- { _id: 2, category: "cafe" },
- { _id: 3, category: "cafE" }
- ])
Using the collection’s collation, the following operation performs acase-insensitive and diacritic-insensitive match:
- db.myColl.aggregate( [ { $match: { category: "cafe" } } ] )
The operation returns the following 3 documents:
- { "_id" : 1, "category" : "café" }
- { "_id" : 2, "category" : "cafe" }
- { "_id" : 3, "category" : "cafE" }
However, the aggregation expression $regexFind
ignorescollation; that is, the following regular expression pattern matching examplesare case-sensitive and diacritic sensitive:
- db.myColl.aggregate( [ { $addFields: { results: { $regexMatch: { input: "$category", regex: /cafe/ } } } } ] )
- db.myColl.aggregate(
- [ { $addFields: { results: { $regexMatch: { input: "$category", regex: /cafe/ } } } } ],
- { collation: { locale: "fr", strength: 1 } } // Ignored in the $regexMatch
- )
Both operations return the following:
- { "_id" : 1, "category" : "café", "results" : false }
- { "_id" : 2, "category" : "cafe", "results" : true }
- { "_id" : 3, "category" : "cafE", "results" : false }
To perform a case-insensitive regex pattern matching, use thei Option instead. Seei Option for an example.
Examples
$regexMatch and Its Options
To illustrate the behavior of the $regexMatch
operator asdiscussed in this example, create a sample collection products
withthe following documents:
- db.products.insertMany([
- { _id: 1, description: "Single LINE description." },
- { _id: 2, description: "First lines\nsecond line" },
- { _id: 3, description: "Many spaces before line" },
- { _id: 4, description: "Multiple\nline descriptions" },
- { _id: 5, description: "anchors, links and hyperlinks" },
- { _id: 6, description: "métier work vocation" }
- ])
By default, $regexMatch
performs a case-sensitive match.For example, the following aggregation performs a case-sensitive$regexMatch
on the description
field. The regexpattern /line/
does not specify any grouping:
- db.products.aggregate([
- { $addFields: { result: { $regexMatch: { input: "$description", regex: /line/ } } } }
- ])
The operation returns the following:
- { "_id" : 1, "description" : "Single LINE description.", "result" : false }
- { "_id" : 2, "description" : "First lines\nsecond line", "result" : true }
- { "_id" : 3, "description" : "Many spaces before line", "result" : true }
- { "_id" : 4, "description" : "Multiple\nline descriptions", "result" : true }
- { "_id" : 5, "description" : "anchors, links and hyperlinks", "result" : false }
- { "_id" : 6, "description" : "métier work vocation", "result" : false }
The following regex pattern /lin(e|k)/
specifies a grouping(e|k)
in the pattern:
- db.products.aggregate([
- { $addFields: { result: { $regexMatch: { input: "$description", regex: /lin(e|k)/ } } } }
- ])
The operation returns the following:
- { "_id" : 1, "description" : "Single LINE description.", "result" : false }
- { "_id" : 2, "description" : "First lines\nsecond line", "result" : true }
- { "_id" : 3, "description" : "Many spaces before line", "result" : true }
- { "_id" : 4, "description" : "Multiple\nline descriptions", "result" : true }
- { "_id" : 5, "description" : "anchors, links and hyperlinks", "result" : true }
- { "_id" : 6, "description" : "métier work vocation", "result" : false }
i Option
Note
You cannot specify options in both the regex
and theoptions
field.
To perform case-insensitive pattern matching, include the i option as part of the regex field or in the optionsfield:
- // Specify i as part of the regex field
- { $regexMatch: { input: "$description", regex: /line/i } }
- // Specify i in the options field
- { $regexMatch: { input: "$description", regex: /line/, options: "i" } }
- { $regexMatch: { input: "$description", regex: "line", options: "i" } }
For example, the following aggregation performs a case-insensitive$regexMatch
on the description
field. The regexpattern /line/
does not specify any grouping:
- db.products.aggregate([
- { $addFields: { result: { $regexMatch: { input: "$description", regex: /line/i } } } }
- ])
The operation returns the following documents:
- { "_id" : 1, "description" : "Single LINE description.", "result" : true }
- { "_id" : 2, "description" : "First lines\nsecond line", "result" : true }
- { "_id" : 3, "description" : "Many spaces before line", "result" : true }
- { "_id" : 4, "description" : "Multiple\nline descriptions", "result" : true }
- { "_id" : 5, "description" : "anchors, links and hyperlinks", "result" : false }
- { "_id" : 6, "description" : "métier work vocation", "result" : false }
m Option
Note
You cannot specify options in both the regex
and theoptions
field.
To match the specified anchors (e.g. ^
, $
) for each line of amultiline string, include the m optionas part of the regex field or in theoptions field:
- // Specify m as part of the regex field
- { $regexMatch: { input: "$description", regex: /line/m } }
- // Specify m in the options field
- { $regexMatch: { input: "$description", regex: /line/, options: "m" } }
- { $regexMatch: { input: "$description", regex: "line", options: "m" } }
The following example includes both the i
and the m
options tomatch lines starting with either the letter s
or S
formultiline strings:
- db.products.aggregate([
- { $addFields: { result: { $regexMatch: { input: "$description", regex: /^s/im } } } }
- ])
The operation returns the following:
- { "_id" : 1, "description" : "Single LINE description.", "result" : true }
- { "_id" : 2, "description" : "First lines\nsecond line", "result" : true }
- { "_id" : 3, "description" : "Many spaces before line", "result" : false }
- { "_id" : 4, "description" : "Multiple\nline descriptions", "result" : false }
- { "_id" : 5, "description" : "anchors, links and hyperlinks", "result" : false }
- { "_id" : 6, "description" : "métier work vocation", "result" : false }
x Option
Note
You cannot specify options in both the regex
and theoptions
field.
To ignore all unescaped white space characters and comments (denoted bythe un-escaped hash #
character and the next new-line character) inthe pattern, include the s option in theoptions field:
- // Specify x in the options field
- { $regexMatch: { input: "$description", regex: /line/, options: "x" } }
- { $regexMatch: { input: "$description", regex: "line", options: "x" } }
The following example includes the x
option to skip unescaped whitespaces and comments:
- db.products.aggregate([
- { $addFields: { returns: { $regexMatch: { input: "$description", regex: /lin(e|k) # matches line or link/, options:"x" } } } }
- ])
The operation returns the following:
- { "_id" : 1, "description" : "Single LINE description.", "returns" : false }
- { "_id" : 2, "description" : "First lines\nsecond line", "returns" : true }
- { "_id" : 3, "description" : "Many spaces before line", "returns" : true }
- { "_id" : 4, "description" : "Multiple\nline descriptions", "returns" : true }
- { "_id" : 5, "description" : "anchors, links and hyperlinks", "returns" : true }
- { "_id" : 6, "description" : "métier work vocation", "returns" : false }
s Option
Note
You cannot specify options in both the regex
and theoptions
field.
To allow the dot character (i.e. .
) in the pattern to match allcharacters including the new line character, include the s option in the options field:
- // Specify s in the options field
- { $regexMatch: { input: "$description", regex: /m.*line/, options: "s" } }
- { $regexMatch: { input: "$description", regex: "m.*line", options: "s" } }
The following example includes the s
option to allow the dotcharacter (i.e. .) to match all characters including new line as wellas the i
option to perform a case-insensitive match:
- db.products.aggregate([
- { $addFields: { returns: { $regexMatch: { input: "$description", regex:/m.*line/, options: "si" } } } }
- ])
The operation returns the following:
- { "_id" : 1, "description" : "Single LINE description.", "returns" : false }
- { "_id" : 2, "description" : "First lines\nsecond line", "returns" : false }
- { "_id" : 3, "description" : "Many spaces before line", "returns" : true }
- { "_id" : 4, "description" : "Multiple\nline descriptions", "returns" : true }
- { "_id" : 5, "description" : "anchors, links and hyperlinks", "returns" : false }
- { "_id" : 6, "description" : "métier work vocation", "returns" : false }
Use $regexMatch to Check Email Address
Create a sample collection feedback
with the following documents:
- db.feedback.insertMany([
- { "_id" : 1, comment: "Hi, I'm just reading about MongoDB -- aunt.arc.tica@example.com" },
- { "_id" : 2, comment: "I wanted to concatenate a string" },
- { "_id" : 3, comment: "How do I convert a date to string? Contact me at either cam@mongodb.com or c.dia@mongodb.com" },
- { "_id" : 4, comment: "It's just me. I'm testing. fred@MongoDB.com" }
- ])
The following aggregation uses the $regexMatch
to checkif the comment
field contains an email address with@mongodb.com
and categorize the feedback as Employee
orExternal
.
- db.feedback.aggregate( [
- { $addFields: {
- "category": { $cond: { if: { $regexMatch: { input: "$comment", regex: /[a-z0-9_.+-]+@mongodb.com/i } },
- then: "Employee",
- else: "External" } }
- } },
The operation returns the following documents:
- { "_id" : 1, "comment" : "Hi, I'm just reading about MongoDB -- aunt.arc.tica@example.com", "category" : "External" }
- { "_id" : 2, "comment" : "I wanted to concatenate a string", "category" : "External" }
- { "_id" : 3, "comment" : "How do I convert a date to string? Contact me at either cam@mongodb.com or c.dia@mongodb.com", "category" : "Employee" }
- { "_id" : 4, "comment" : "It's just me. I'm testing. fred@MongoDB.com", "category" : "Employee" }