通配符索引 (Wildcard Indexes)
MongoDB 支持在一个字段或一组字段上创建索引,以提高查询性能。MongoDB 支持 灵活模式,这意味着文档字段名在一个集合中可能会有所不同。使用通配符索引来支持对任意或未知字段的查询。
要创建通配符索引,请使用通配符说明符 ( $**
) 作为索引键:
db.collection.createIndex( { "$**": <sortOrder> } )
您可以使用以下命令创建通配符索引:
用例
仅当需要索引的字段未知或可能更改时,才使用通配符索引。通配符索引的性能不及针对特定字段的目标索引。如果集合包含阻止目标索引建立的任意字段名称,则应考虑重新构建模式以获得一致的字段名称。要了解有关目标索引的更多信息,请参阅创建索引以支持您的查询。
考虑在以下情况下使用通配符索引:
如果您的应用程序查询字段名称因文档而异的集合,请创建通配符索引以支持对所有可能的文档字段名称进行查询。
如果应用程序重复查询子字段不一致的嵌入式文档字段,请创建通配符索引以支持对所有子字段的查询。
如果应用程序会对具有共同特征的文档进行查询。复合通配符索引可以有效地覆盖许多具有共同字段的文档查询。要了解详情,请参阅复合通配符索引。
开始体验
可以使用通配符索引执行以下任务:
详情
通配符索引的行为如下:
您可以在一个集合中创建多个通配符索引。
通配符索引可涵盖与集合中其他索引相同的字段。
默认情况下,通配符索引会省略
_id
字段。要将_id
字段包含在通配符索引中,您必须通过指定{ "_id" : 1 }
将其明确包含在wildcardProjection
文档中。通配符索引是稀疏索引,仅包含具有索引字段的文档的条目,即使索引字段包含空值也是如此。
覆盖查询
仅当满足以下所有条件时,通配符索引才支持覆盖查询:
查询规划器选择通配符索引来满足查询条件。
查询谓词可精确指定通配符索引所涵盖的一个字段。
查询投影明确排除
_id
,仅包含查询字段。指定的查询字段绝不是数组。
请考虑 employees
集合的以下通配符索引:
db.employees.createIndex( { "$**" : 1 } )
以下操作查询单个字段 lastName
并从结果文档中投影出所有其他字段:
db.employees.find( { "lastName" : "Doe" }, { "_id" : 0, "lastName" : 1 } )
如果指定的 lastName
绝不是数组,则 MongoDB 可以使用 $**
通配符索引来支持覆盖的查询。
了解详情
若要了解有关通配符索引的详细信息,请参阅: