MongoDB——索引类型之通配符索引(Wildcard Indexes)

Posted 小志的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoDB——索引类型之通配符索引(Wildcard Indexes)相关的知识,希望对你有一定的参考价值。

目录

一、MongoDB官网地址

二、通配符索引(Wildcard Indexes)的概述

  • MongoDB的文档模式是动态变化的,而通配符索引可以建立在一些不可预知的字段上,以此实现查询的加速。
  • MongoDB 4.2 引入了通配符索引来支持对未知或任意字段的查询。

三、通配符索引(Wildcard Indexes)的示例

3.1、准备商品数据,不同商品属性不一样

  • 准备数据集,执行脚本

    db.products.insert([
    
      "product_name" : "Spy Coat",
      "product_attributes" : 
       "material" : [ "Tweed", "Wool", "Leather" ],
       "size" : 
        "length" : 72,
        "units" : "inches"
       
      
    ,
    
      "product_name" : "Spy Pen",
      "product_attributes" : 
        "colors" : [ "Blue", "Black" ],
    	"secret_feature" : 
    	     "name" : "laser",
    	     "power" : "1000",
    	     "units" : "watts",
    	
      
    ,
    
      "product_name" : "Spy Book"
    
    ])
    

  • 查看初始化的数据

    db.products.find()
    

3.2、创建通配符索引

  • 创建通配符索引

    db.products.createIndex(  "product_attributes.$**" : 1  )
    

  • 查看创建的通配符索引

    > db.products.getIndexes()
    

3.3、测试

  • 通配符索引可以支持任意单字段查询 product_attributes或其嵌入字段

  • 测试1

    db.products.find(  "product_attributes.size.length" :  $gt : 60   )
    

  • 测试2

    > db.products.find(  "product_attributes.material" : "Leather"  ).pretty()
    

  • 测试3

    > db.products.find(  "product_attributes.secret_feature.name" : "laser"  ).pretty()
    

四、通配符索引(Wildcard Indexes)的限制

4.1、通配符索引不支持以下索引类型或属性

  • 不支持以下索引类型或属性
    (1)、 Compound
    (2)、TTL
    (3)、 Text
    (4)、 2d(Geospatial)
    (5)、2dsphere(Geospatial)
    (6)、 Hashed
    (7)、 Unique

  • 示例:创建通配符索引的复合索引,提示不能创建此索引

    db.products.createIndex(  "product_attributes.$**" : 1,"product_name":1  )
    

4.2、通配符索引不能支持查询字段不存在的文档

通配符索引是稀疏的,不索引空字段。因此,通配符索引不能支持查询字段不存在的文档。

  • 示例:

  • 通配符索引不能支持以下查询,由下图可知,可以查询出数据。

    db.products.find( "product_attributes" :  $exists : false   )
    

  • 但是查看执行计划,发现是集合扫描(相当于全表扫描),没有走索引。

    > db.products.find( "product_attributes" :  $exists : false   ).explain()
    

4.3、通配符索引不能支持精确的文档或者数组相等匹配

通配符索引为文档或数组的内容生成条目,而不是文档/数组本身。因此通配符索引不能支持精确的文档/数组相等匹配。通配符索引可以支持查询字段等于空文档的情况。

  • 示例

  • 通配符索引不能支持以下查询,由下图可知,可以查询出数据。

    > db.products.find( "product_attributes.colors" : [ "Blue", "Black" ]  )
    

  • 但是查看执行计划,发现是集合扫描(相当于全表扫描),没有走索引。

    > db.products.find( "product_attributes.colors" : [ "Blue", "Black" ]  ).explain()
    

以上是关于MongoDB——索引类型之通配符索引(Wildcard Indexes)的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB高效查询之索引机制

MongoDB——索引类型之Hash索引(Hashed Indexes)

MongoDB——索引类型之Hash索引(Hashed Indexes)

MongoDB——索引类型之全文索引(Text Indexes)

MongoDB——索引类型之全文索引(Text Indexes)

MongoDB——索引类型之复合索引(Compound Index)