Limit the Number of Entries Scanned
This tutorial describes how to create indexes to limit the number ofindex entries scanned for queries that includes a $text
expression and equality conditions.
A collection inventory
contains the following documents:
- { _id: 1, dept: "tech", description: "lime green computer" }
- { _id: 2, dept: "tech", description: "wireless red mouse" }
- { _id: 3, dept: "kitchen", description: "green placemat" }
- { _id: 4, dept: "kitchen", description: "red peeler" }
- { _id: 5, dept: "food", description: "green apple" }
- { _id: 6, dept: "food", description: "red potato" }
Consider the common use case that performs text searches byindividual departments, such as:
- db.inventory.find( { dept: "kitchen", $text: { $search: "green" } } )
To limit the text search to scan only those documents within a specificdept
, create a compound index that first specifies anascending/descending index key on the field dept
and then atext
index key on the field description
:
- db.inventory.createIndex(
- {
- dept: 1,
- description: "text"
- }
- )
Then, the text search within a particular departmentwill limit the scan of indexed documents. For example, the followingquery scans only those documents with dept
equal to kitchen
:
- db.inventory.find( { dept: "kitchen", $text: { $search: "green" } } )
Note
- A compound
text
index cannot include any other special indextypes, such as multi-key orgeospatial index fields. - If the compound
text
index includes keys preceding thetext
index key, to perform a$text
search, the querypredicate must include equality match conditions on the precedingkeys. - When creating a compound
text
index, alltext
index keys mustbe listed adjacently in the index specification document.
See also