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

x33g5p2x  于2022-05-05 转载在 其他  
字(2.6k)|赞(0)|评价(0)|浏览(363)

一、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 }
] )

相关文章