MongoDB——索引属性之部分索引(Partial Indexes)

Posted 小志的博客

tags:

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

目录

一、MongoDB官网地址

二、部分索引(Partial Indexes)的概述

  • 部分索引仅对满足指定过滤器表达式的文档进行索引。通过在一个集合中为文档的一个子集建立索引。
  • 部分索引具有更低的存储需求和更低的索引创建和维护的性能成本。3.2新版功能。
  • 部分索引提供了稀疏索引功能的超集,应该优先于稀疏索引。

三、部分索引(Partial Indexes)的创建语法

  • 语法
    要创建部分索引,请使用 db.collection.createIndex()带有 partialFilterExpression选项的方法。

    db.collection.createIndex(
      partialFilterExpression:  fileName3:  $gt: 5   
    )
    
  • 该partialFilterExpression 选项接受使用以下方式指定过滤条件的文档:

    partialFilterExpression选项定过滤条件的表达式
    partialFilterExpression等式表达式(即field: value或使用$eq 运算符)
    partialFilterExpression$exists: true表达式
    partialFilterExpression$gt, $gte, $lt, $lte表达式
    partialFilterExpression$type表达式
    partialFilterExpression$and仅顶级运算符

四、部分索引(Partial Indexes)的示例

4.1、数据准备

  • 初始化数据

    db.restaurants.insert(
     "_id" : ObjectId("5641f6a7522545bc535b5dc9"),
     "address" : 
      "building" : "1007",
      "coord" : [
        -73.856077,
        40.848447
      ],
      "street" : "Morris Park Ave",
      "zipcode" : "10462"
     ,
     "borough" : "Bronx",
     "cuisine" : "Bakery",
     "rating" :  "date" : ISODate("2014-03-03T00:00:00Z"),
           "grade" : "A",
           "score" : 2
          ,
     "name" : "Morris Park Bake Shop",
     "restaurant_id" : "30075445"
    )
    
  • 查看初始化数据

4.2、创建部分索引(Partial Indexes)

  • 创建部分索引

    db.restaurants.createIndex(
      borough: 1, cuisine: 1 ,
      partialFilterExpression:  'rating.grade':  $eq: "A"   
    )
    

  • 查看创建的索引

    db.restaurants.getIndexes()
    

4.3、测试1

  • 查询数据

    db.restaurants.find(  borough: "Bronx", 'rating.grade': "A"  )
    

  • 查看执行计划

    db.restaurants.find(  borough: "Bronx", 'rating.grade': "A"  ).explain()
    

4.4、测试2

  • 查询数据

    db.restaurants.find(  borough: "Bronx", cuisine: "Bakery"  )
    

  • 查看执行计划

    db.restaurants.find(  borough: "Bronx", cuisine: "Bakery"  ).explain()
    

五、唯一约束结合部分索引使用导致唯一约束失效的问题

  • 如果同时指定partialFilterExpression和唯一约束,那么唯一约束只适用于满足筛选器表达式的文档。如果文档不满足筛选条件,那么带有惟一约束的部分索引不会阻止插入不满足惟一约束的文档

六、唯一约束结合部分索引的示例

6.1、数据准备

  • 初始化数据

    db.users.insertMany( [
      username: "david", age: 29 ,
      username: "amanda", age: 35 ,
      username: "rajiv", age: 57 
    ] )
    

  • 查询初始化的数据

    db.users.find()
    

6.2、创建唯一约束并结合部分索引

  • 创建索引,指定username字段和部分过滤器表达式age: $gte: 21的唯一约束。

    db.users.createIndex(
      username: 1 ,
      unique: true, partialFilterExpression:  age:  $gte: 21   
    )
    

6.3、测试

  • 索引防止了以下文档的插入,因为文档已经存在,且指定的用户名唯一和年龄字段大于21

    db.users.insertMany([
     username:"david",age:27,
     username:"amanda",age: 25,
     username:"rajiv",age: 32
    ])
    

  • 但是,以下具有重复用户名的文档是允许的,因为唯一约束只适用于年龄大于或等于21岁的文档。

    db.users.insertMany( [
      username: "david", age: 20 ,
      username: "amanda" ,
      username: "rajiv", age: null 
    ] )
    

以上是关于MongoDB——索引属性之部分索引(Partial Indexes)的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB——索引属性之隐藏索引(Hidden Indexes)

MongoDB——索引属性之隐藏索引(Hidden Indexes)

MongoDB 学习笔记之 TTL索引,部分索引和文本索引

MongoDB——索引属性之稀疏索引(Sparse Indexes)

MongoDB——索引属性之稀疏索引(Sparse Indexes)

MongoDB——索引属性之TTL索引(TTL Indexes)