在通配符索引中包含或排除字段
创建通配符索引时,可以指定要在索引中包含或排除的字段。 这可以让您:
创建仅涵盖特定字段的通配符索引。例如,如果您有多个包含多个子字段的嵌入式文档,则可以创建索引以涵盖对嵌入式文档及其子字段的查询。
创建省略特定字段的通配符索引。例如,如果您有一个集合,其中包含一个从未查询过的字段,则您可以从索引中省略该字段。
要在通配符索引中包含或排除字段,请在 wildcardProjection
选项中指定所选字段:
db.<collection>.createIndex( { "$**" : <sortOrder> }, { "wildcardProjection" : { "<field1>" : < 0 | 1 >, "<field2>" : < 0 | 1 >, ... "<fieldN>" : < 0 | 1 > } } )
在wildcardProjection
文档中,值0
或1
指示索引是包含还是排除该字段:
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.size
和attributes.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
筛选字段。
要学习;了解有关通配符索引的行为和使用案例的更多信息,请参阅: