文档菜单
文档首页
/
MongoDB 手册
/ /

通配符索引

本页内容

  • 用例
  • 开始使用
  • 详细信息
  • 涵盖的查询
  • 了解更多

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

要创建通配符索引,使用通配符指定符($**)作为索引键

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

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

仅在您要索引的字段是未知或可能更改的情况下使用通配符索引。通配符索引的性能不如特定字段的针对性索引。如果您的集合包含防止针对性索引的任意字段名,请考虑重新设计模式以具有一致的字段名。有关针对性索引的更多信息,请参阅创建索引以支持查询。

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

  • 如果您的应用程序查询的字段名在文档之间变化的集合,创建通配符索引以支持对所有可能的文档字段名的查询。

  • 如果您的应用程序反复查询嵌套文档字段,其中子字段不一致,创建通配符索引以支持对所有子字段的查询。

  • 如果您的应用程序查询具有共同特征的文档。复合通配符索引可以有效地涵盖具有共同字段的文档的许多查询。有关更多信息,请参阅复合通配符索引。

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

通配符索引的行为如下

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

  • 通配符索引可以覆盖与其他索引相同的字段。

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

  • 通配符索引是稀疏索引,并且只包含具有索引字段的文档条目,即使索引字段包含空值。

  • 通配符索引与通配符文本索引不同且不兼容。通配符索引不支持使用$text运算符的查询。

只有当以下所有条件都为真时,通配符索引才能支持覆盖查询

  • 查询计划器选择通配符索引以满足查询谓词。

  • 查询谓词指定通配符索引覆盖的恰好一个字段。

  • 查询投影显式排除_id并且只包含查询字段。

  • 指定的查询字段永远不会是数组。

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

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

以下操作查询单个字段lastName并从结果文档中排除所有其他字段

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

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

了解更多关于通配符索引的信息,请参阅

返回

边界