通配符索引

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可以使用 $**通配符索引来支持覆盖查询。

了解更多

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

Copyright © 上海锦木信息技术有限公司 all right reserved,powered by Gitbook文件修订时间: 2023-09-01 17:10:26

results matching ""

    No results matching ""