OPTIONS
翻译或纠错本页面

限制被扫描项的数量

本本描述了在带有 $text 表达式和相等匹配的查询中如何限制被扫描的索引项的数量。

集合 inventory 有如下文档:

{ _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" }

假设一种通常使用场景,即在 单个 dept里进行文本搜索,例如:

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

为了能够限制文本搜索只扫描那些有指定 dept 的文档,可以创建一个复合索引,其中 第一个键dept 且顺序为递增或递减,第二个键是键 description 上的 文本 索引:

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

这样,在特定部门(dept)里的文本搜索 [1] 就限制了被索引文档的扫描数量。例如,如下查询只会扫描那些 dept 键等于 kitchen 或者 food 的文档:

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

复合 文本 索引不能再包含其他任何特殊类型的索引,例如 多键 或者 地理 索引。

如果复合 文本 索引中有其他键在 文本 索引 ``之前,(方便起见,我们称之为先导键),那么在执行 $text 搜索时,查询条件中必须包含对先导键的 相等匹配条件

[1]

如果使用淘汰了的 text 命令,那么 text 命令 必须 包含 filter 选项,其中指定了对先导键的 相等匹配 条件。

参见

文本索引