Docs 菜单
Docs 主页
/
数据库手册
/ / /

在通配符索引中包含或排除字段

在此页面上

  • 限制
  • 开始之前
  • 步骤
  • 在通配符索引中包含特定字段
  • 从通配符索引中排除特定字段
  • 了解详情

创建通配符索引时,可以指定要在索引中包含或排除的字段。 这可以让您:

  • 创建仅涵盖特定字段的通配符索引。例如,如果您有多个包含多个子字段的嵌入式文档,则可以创建索引以涵盖对嵌入式文档及其子字段的查询。

  • 创建省略特定字段的通配符索引。例如,如果您有一个集合,其中包含一个从未查询过的字段,则您可以从索引中省略该字段。

要在通配符索引中包含或排除字段,请在 wildcardProjection选项中指定所选字段:

db.<collection>.createIndex(
{
"$**" : <sortOrder>
},
{
"wildcardProjection" : {
"<field1>" : < 0 | 1 >,
"<field2>" : < 0 | 1 >,
...
"<fieldN>" : < 0 | 1 >
}
}
)

wildcardProjection文档中,值01指示索引是包含还是排除该字段:

  • 0 表示已排除该字段。

  • 1 表示包含该字段。

  • 要使用wildcardProjection选项,索引键必须为$**

  • 通配符索引不支持在 wildcardProjection 文档中混用包含和排除语句,除非显示包含 _id 字段时。例如:

    • 以下 wildcardProjection 文档是无效的,因为它分别指定对某一字段进行包含和排除:

      {
      "wildcardProjection" : {
      "attributes" : 0,
      "users" : 1
      }
      }
    • 以下wildcardProjection文档是有效的,因为尽管它同时指定包含和排除,但它包含_id字段:

      {
      "wildcardProjection" : {
      "attributes" : 0,
      "_id" : 1
      }
      }

创建一个 products 集合,其中包含以下文档:

db.products.insertMany( [
{
"item": "t-shirt",
"price": "29.99",
"attributes": {
"material": "cotton",
"color": "blue",
"size": {
"units": "cm",
"length": 74
}
}
},
{
"item": "milk",
"price": "3.99",
"attributes": {
"sellBy": "02-06-2023",
"type": "oat"
}
},
{
"item": "laptop",
"price": "339.99",
"attributes": {
"memory": "8GB",
"size": {
"units": "inches",
"height": 10,
"width": 15
}
}
}
] )

每个文档都有一个包含产品详细信息的attributes字段。 attributes的子字段因产品而异。

您可以使用wildcardProjection选项:

  • 在通配符索引中包含特定字段

  • 从通配符索引中排除特定字段

如果您经常查询某些文档字段,您可以在 wildcardProjection 中指定这些字段以支持这些查询,不给索引增加不必要的臃肿。

以下操作创建一个通配符索引,其中包含attributes.sizeattributes.color字段的所有标量值(即字符串和数字):

db.products.createIndex(
{
"$**" : 1
},
{
"wildcardProjection" : {
"attributes.size" : 1,
"attributes.color" : 1
}
}
)

虽然键模式"$**"涵盖了文档中的所有字段,但wildcardProjection字段将索引限制为仅包含所包含的字段。

如果字段是嵌入式文档或数组(如 attributes.size ),则通配符索引将对该字段进行递归并对所有内嵌的标量字段值进行索引。

创建的索引支持对 wildcardProjection 对象中包含的任何标量值进行查询。例如,索引支持以下查询:

db.products.find( { "attributes.size.height" : 10 } )
db.products.find( { "attributes.color" : "blue" } )

该索引仅支持对wildcardProjection对象中包含的字段进行查询。 在此示例中, MongoDB对以下查询执行集合扫描,因为它包含wildcardProjection对象中不存在的字段:

db.products.find ( { "item": "milk" } )

如果存在您很少查询的文档字段,则可以创建省略这些字段的通配符索引。

以下操作在 products 集合中的所有文档字段上创建通配符索引,但在索引中省略了 attributes.memory 字段:

db.products.createIndex(
{
"$**" : 1
},
{
"wildcardProjection" : {
"attributes.memory" : 0
}
}
)

虽然键模式"$**"涵盖了文档中的所有字段,但wildcardProjection字段从索引中排除了attributes.memory值。

如果字段是嵌入式文档或数组(如 attributes.size ),则通配符索引将对该字段进行递归并对所有内嵌的标量字段值进行索引。

例如,索引支持这些查询:

db.products.find( { "attributes.color" : "blue" } )
db.products.find( { "attributes.size.height" : 10 } )

该索引支持对attributes.memory进行查询,因为索引中省略了该字段。

要学习;了解如何使用通配符投影和复合通配符索引来过滤字段,请参阅使用wildcardProjection筛选字段。

要学习;了解有关通配符索引的行为和使用案例的更多信息,请参阅:

后退

创建