Docs 菜单
Docs 主页
/
MongoDB Manual
/ /

通配符索引 (Wildcard Indexes)

在此页面上

  • 用例
  • 开始体验
  • 详情
  • 覆盖查询
  • 了解详情

MongoDB 支持在一个字段或一组字段上创建索引,以提高查询性能。MongoDB 支持 灵活模式,这意味着文档字段名在一个集合中可能会有所不同。使用通配符索引来支持对任意或未知字段的查询。

要创建通配符索引,请使用通配符说明符 ( $** ) 作为索引键:

db.collection.createIndex( { "$**": <sortOrder> } )

您可以使用以下命令创建通配符索引:

仅当需要索引的字段未知或可能更改时,才使用通配符索引。通配符索引的性能不及针对特定字段的目标索引。如果集合包含阻止目标索引建立的任意字段名称,则应考虑重新构建模式以获得一致的字段名称。要了解有关目标索引的更多信息,请参阅创建索引以支持您的查询

考虑在以下情况下使用通配符索引:

  • 如果您的应用程序查询字段名称因文档而异的集合,请创建通配符索引以支持对所有可能的文档字段名称进行查询。

  • 如果应用程序重复查询子字段不一致的嵌入式文档字段,请创建通配符索引以支持对所有子字段的查询。

  • 如果应用程序会对具有共同特征的文档进行查询。复合通配符索引可以有效地覆盖许多具有共同字段的文档查询。要了解详情,请参阅复合通配符索引。

可以使用通配符索引执行以下任务:

通配符索引的行为如下:

  • 您可以在一个集合中创建多个通配符索引。

  • 通配符索引可涵盖与集合中其他索引相同的字段。

  • 默认情况下,通配符索引会省略 _id 字段。要将 _id 字段包含在通配符索引中,您必须通过指定 { "_id" : 1 } 将其明确包含在 wildcardProjection 文档中。

  • 通配符索引是稀疏索引,仅包含具有索引字段的文档的条目,即使索引字段包含空值也是如此。

  • 通配符索引不同于通配符文本索引,并且与通配符文本索引不兼容。通配符索引不支持使用 $text 操作符的查询。

仅当满足以下所有条件时,通配符索引才支持覆盖查询

  • 查询规划器选择通配符索引来满足查询条件。

  • 查询谓词可精确指定通配符索引所涵盖的一个字段。

  • 查询投影明确排除 _id包含查询字段。

  • 指定的查询字段绝不是数组。

请考虑 employees 集合的以下通配符索引:

db.employees.createIndex( { "$**" : 1 } )

以下操作查询单个字段 lastName 并从结果文档中投影出所有其他字段:

db.employees.find(
{ "lastName" : "Doe" },
{ "_id" : 0, "lastName" : 1 }
)

如果指定的 lastName 绝不是数组,则 MongoDB 可以使用 $** 通配符索引来支持覆盖的查询。

若要了解有关通配符索引的详细信息,请参阅:

后退

边界