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——索引属性之稀疏索引(Sparse Indexes)