Navigation
This version of the documentation is archived and no longer supported.

Limit the Number of Entries Scanned

This tutorial describes how to create indexes to limit the number of index 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 by individual departments, such as:

db.inventory.find( { dept: "kitchen", $text: { $search: "green" } } )

To limit the text search to scan only those documents within a specific dept, create a compound index that first specifies an ascending/descending index key on the field dept and then a text index key on the field description:

db.inventory.ensureIndex(
   {
     dept: 1,
     description: "text"
   }
)

Then, the text search [1] within a particular department will limit the scan of indexed documents. For example, the following query 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 index types, such as multi-key or geospatial index fields.
  • If the compound text index includes keys preceding the text index key, to perform a $text search, the query predicate must include equality match conditions on the preceding keys.
[1]If using the deprecated text command, the text command must include the filter option that specifies an equality condition for the prefix fields.

See also

Text Indexes