Use Atlas Search for Full-Text Search Queries![](/cloud-docs/docsworker-xlarge/DOCSP-22568/assets/link.svg)
If your queries rely on inefficient regex matching, Atlas Search queries that use the $search aggregation pipeline stage can significantly improve the performance of text queries and offer more options for customizing query parameters.
Avoid Inefficient Regex Matching![](/cloud-docs/docsworker-xlarge/DOCSP-22568/assets/link.svg)
If you frequently run case-insensitive regex queries (utilizing the
i
option), we recommend Atlas Search queries
that use the $search aggregation pipeline
stage. Alternatively, you can create a case-insensitive index to support your queries. You can
also specify a collation on an index
to define language-specific rules for string comparison, such as rules
for lettercase and accent marks. However, collation can cause some functionality loss compared to
Atlas Search queries. While a case-insensitive
index improves performance for case-insensitive queries,
Atlas Search queries more significiantly improve
the performance of text queries and offer more options for customizing
query parameters.
Example![](/cloud-docs/docsworker-xlarge/DOCSP-22568/assets/link.svg)
Consider an employees
collection with the following documents. This
collection has no indexes besides the default _id
index:
// employees collection { "_id": 1, "first_name": "Hannah", "last_name": "Simmons", "dept": "Engineering" }, { "_id": 2, "first_name": "Michael", "last_name": "Hughes", "dept": "Security" }, { "_id": 3, "first_name": "Wendy", "last_name": "Crawford", "dept": "Human Resources" }, { "_id": 4, "first_name": "MICHAEL", "last_name": "FLORES", "dept": "Sales" }
If your application frequently queries the first_name
field, you may
want to run case-insensitive regex queries to more easily find matching
names. Case-insensitive regex also matches against differing data
formats, as in the example above where you have first_names
of both
"Michael" and "MICHAEL". However, we recommend
Atlas Search queries that use the $search aggregation pipeline stage.
If a user searches for the string "michael", the application may run the following query:
db.employees.find( { first_name: { $regex: /michael/i } } )
Since this query specifies the
$regex option i
, it is
case-insensitive. The query returns the following documents:
{ "_id" : 2, "first_name" : "Michael", "last_name" : "Hughes", "dept" : "Security" } { "_id" : 4, "first_name" : "MICHAEL", "last_name" : "FLORES", "dept" : "Sales" }
Although this query does return the expected documents, case-insensitive regex queries with no index support are not very performant.
To improve performance, create an
Atlas Search index. While you can create a
case-insensitive index on the
first_name
field, Atlas Search queries more
significantly improve the performance of text queries and offer more
options for customizing query parameters.
Regex Index | Atlas Search Index | |||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
|
Collation can cause some
functionality loss. When the strength
field of an index's
collation
document is 1
or 2
, the index is
case-insensitive. For a detailed description of the collation document
and the different strength
values, see Collation Document.
For the application to use the case-insesitive index, you must also
specify the same collation document from the index in the regex
query. While you can remove the $regex
operator from the previous
find()
method and use the newly
created index, we recommend that you use an Atlas Search query that uses the $search
aggregation pipeline stage.
Regex Query | Atlas Search Query | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
Do not use the $regex
operator when using a case-insensitive index for your query. The
$regex
implementation is not collation-aware and cannot utilize
case-insensitive indexes. Instead, we recommend
Atlas Search queries that use the
$search aggregation pipeline stage.
Learn More![](/cloud-docs/docsworker-xlarge/DOCSP-22568/assets/link.svg)
- To learn more about Atlas Search queries, see Create and Run Search Queries.
- To learn more about case-insensitive indexes with illustrative examples, see Case Insensitive Indexes.
- To learn more about regex queries in MongoDB, see $regex.
- MongoDB University offers a free course on optimizing MongoDB Performance. To learn more, see M201: MongoDB Performance.