Skip to content

Commit ac1ebd2

Browse files
(DOCS-16615): Clarify case-insensitive regex query behavior (#6108)
* (DOCS-16615): Clarify case-insensitive regex query behavior * fix key formatting * standardize hyphenation * fix case * fix placeholders * reorg behavior * reorg * use admonition * edits * tweaks * wording
1 parent 221b269 commit ac1ebd2

File tree

3 files changed

+66
-37
lines changed

3 files changed

+66
-37
lines changed

source/core/index-case-insensitive.txt

Lines changed: 49 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
.. _index-feature-case-insensitive:
22

33
========================
4-
Case Insensitive Indexes
4+
Case-Insensitive Indexes
55
========================
66

77
.. default-domain:: mongodb
@@ -12,42 +12,59 @@ Case Insensitive Indexes
1212
:depth: 2
1313
:class: singlecol
1414

15-
Case insensitive indexes support queries that perform string
16-
comparisons without regard for case.
15+
Case-insensitive indexes support queries that perform string comparisons
16+
without regard for case. Case insensitivity is derived from
17+
:ref:`collation <collation>`.
1718

18-
You can create a case insensitive index with
19-
:method:`db.collection.createIndex()` by specifying the ``collation``
20-
parameter as an option. For example:
19+
.. important::
2120

22-
.. code-block:: javascript
21+
.. include:: /includes/indexes/case-insensitive-regex-queries.rst
2322

24-
db.collection.createIndex( { "key" : 1 },
25-
{ collation: {
26-
locale : <locale>,
27-
strength : <strength>
28-
}
29-
} )
23+
Command Syntax
24+
--------------
3025

31-
To specify a collation for a case sensitive index, include:
26+
You can create a case-insensitive index with
27+
:method:`db.collection.createIndex()` by specifying the ``collation``
28+
option:
3229

33-
- ``locale``: specifies language rules. See
34-
:ref:`Collation Locales<collation-languages-locales>` for a list of
35-
available locales.
30+
.. code-block:: javascript
3631

37-
- ``strength``: determines comparison rules. A value of
38-
``1`` or ``2`` indicates a case insensitive collation.
32+
db.collection.createIndex(
33+
{
34+
<field>: <sortOrder>
35+
},
36+
{
37+
collation:
38+
{
39+
locale : <locale>,
40+
strength : < 1 | 2 >
41+
}
42+
}
43+
)
44+
45+
To specify a collation for a case-insensitive index, include the
46+
following fields in the ``collation`` object:
47+
48+
.. list-table::
49+
:header-rows: 1
50+
:widths: 10 20
51+
52+
* - Field
53+
- Description
54+
55+
* - ``locale``
56+
- Specifies language rules. For a list of available locales, see
57+
:ref:`collation-languages-locales`.
58+
* - ``strength``
59+
- Determines comparison rules. A ``strength`` value of 1 or 2
60+
indicates case-insensitive collation.
3961

4062
For additional collation fields, see
4163
:ref:`Collation<collation-document-fields>`.
4264

4365
Behavior
4466
--------
4567

46-
Using a case insensitive index does not affect
47-
the results of a query, but it can increase performance; see
48-
:ref:`Indexes <indexes>` for a detailed discussion of the costs and
49-
benefits of indexes.
50-
5168
To use an index that specifies a collation, query and sort operations
5269
must specify the same collation as the index. If a collection has
5370
defined a collation, all queries and indexes inherit that collation
@@ -58,26 +75,28 @@ Examples
5875

5976
.. _no-default-collation-example:
6077

61-
Create a Case Insensitive Index
78+
Create a Case-Insensitive Index
6279
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
6380

64-
To use a case insensitive index on a collection with no default
81+
To use a case-insensitive index on a collection with no default
6582
collation, create an index with a collation and set the ``strength``
6683
parameter to ``1`` or ``2`` (see
6784
:ref:`Collation<collation-document-fields>` for a detailed
6885
description of the ``strength`` parameter). You must specify the same
6986
collation at the query level in order to use the index-level collation.
7087

7188
The following example creates a collection with no default collation,
72-
then adds an index on the ``type`` field with a case insensitive
89+
then adds an index on the ``type`` field with a case-insensitive
7390
collation.
7491

7592
.. code-block:: javascript
7693

7794
db.createCollection("fruit")
7895

79-
db.fruit.createIndex( { type: 1},
80-
{ collation: { locale: 'en', strength: 2 } } )
96+
db.fruit.createIndex(
97+
{ type: 1 },
98+
{ collation: { locale: 'en', strength: 2 } }
99+
)
81100

82101
To use the index, queries must specify the same collation.
83102

@@ -99,7 +118,7 @@ To use the index, queries must specify the same collation.
99118

100119
.. _default-collation-example:
101120

102-
Case Insensitive Indexes on Collections with a Default Collation
121+
Case-Insensitive Indexes on Collections with a Default Collation
103122
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
104123

105124
When you create a collection with a default collation, all the indexes
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Case-insensitive indexes typically do not improve performance for
2+
:query:`$regex` queries. The ``$regex`` implementation is not
3+
collation-aware and cannot utilize case-insensitive indexes efficiently.

source/reference/operator/query/regex.txt

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,8 @@ expression.
9494
- Syntax Restrictions
9595

9696
* - ``i``
97-
- Case insensitivity to match upper and lower cases.
98-
For an example, see :ref:`regex-case-insensitive`.
97+
- Case insensitivity to match upper and lower cases. For an
98+
example, see :ref:`regex-case-insensitive`.
9999
-
100100

101101
* - ``m``
@@ -250,10 +250,16 @@ operation on both:
250250
Index Use
251251
~~~~~~~~~~
252252

253+
Index use and performance for ``$regex`` queries varies depending on
254+
whether the query is case-sensitive or case-insensitive.
255+
256+
Case-Sensitive Queries
257+
``````````````````````
258+
253259
.. TODO Probably should clean up a bit of the writing here
254260

255-
For case sensitive regular expression queries, if an index exists for
256-
the field, then MongoDB matches the regular expression against the
261+
For case sensitive regular expression queries, if an index exists
262+
for the field, then MongoDB matches the regular expression against the
257263
values in the index, which can be faster than a collection scan.
258264

259265
Further optimization can occur if the regular expression is a "prefix
@@ -273,9 +279,10 @@ All of these expressions use an index if an appropriate index
273279
exists; however, ``/^a.*/``, and ``/^a.*$/`` are slower. ``/^a/``
274280
can stop scanning after matching the prefix.
275281

276-
Case insensitive regular expression queries generally cannot use indexes
277-
effectively. The ``$regex`` implementation is not collation-aware
278-
and is unable to utilize case-insensitive indexes.
282+
Case-Insensitive Queries
283+
````````````````````````
284+
285+
.. include:: /includes/indexes/case-insensitive-regex-queries.rst
279286

280287
Examples
281288
--------

0 commit comments

Comments
 (0)