您当前的位置: 首页 >  ar

小志的博客

暂无认证

  • 0浏览

    0关注

    1217博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

小志的博客 发布时间:2022-05-04 18:02:33 ,浏览量:0

目录
    • 一、MongoDB官网地址
    • 二、部分索引(Partial Indexes)的概述
    • 三、部分索引(Partial Indexes)的创建语法
    • 四、部分索引(Partial Indexes)的示例
      • 4.1、数据准备
      • 4.2、创建部分索引(Partial Indexes)
      • 4.3、测试1
      • 4.4、测试2
    • 五、唯一约束结合部分索引使用导致唯一约束失效的问题
    • 六、唯一约束结合部分索引的示例
      • 6.1、数据准备
      • 6.2、创建唯一约束并结合部分索引
      • 6.3、测试

一、MongoDB官网地址
  • MongoDB官网地址:https://www.mongodb.com/docs/manual/core/index-single/
二、部分索引(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 }
    ] )
    

    在这里插入图片描述

关注
打赏
1661269038
查看更多评论
立即登录/注册

微信扫码登录

0.0783s