目录
一、MongoDB官网地址
- 一、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官网地址:https://www.mongodb.com/docs/manual/core/index-single/
- 部分索引仅对满足指定过滤器表达式的文档进行索引。通过在一个集合中为文档的一个子集建立索引。
- 部分索引具有更低的存储需求和更低的索引创建和维护的性能成本。3.2新版功能。
- 部分索引提供了稀疏索引功能的超集,应该优先于稀疏索引。
-
语法 要创建部分索引,请使用 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仅顶级运算符
-
初始化数据
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" })
-
查看初始化数据
-
创建部分索引
db.restaurants.createIndex( { borough: 1, cuisine: 1 }, { partialFilterExpression: { 'rating.grade': { $eq: "A" } } } )
-
查看创建的索引
db.restaurants.getIndexes()
-
查询数据
db.restaurants.find( { borough: "Bronx", 'rating.grade': "A" } )
-
查看执行计划
db.restaurants.find( { borough: "Bronx", 'rating.grade': "A" } ).explain()
-
查询数据
db.restaurants.find( { borough: "Bronx", cuisine: "Bakery" } )
-
查看执行计划
db.restaurants.find( { borough: "Bronx", cuisine: "Bakery" } ).explain()
- 如果同时指定了partialFilterExpression和唯一约束,那么唯一约束只适用于满足筛选器表达式的文档。如果文档不满足筛选条件,那么带有惟一约束的部分索引不会阻止插入不满足惟一约束的文档
-
初始化数据
db.users.insertMany( [ { username: "david", age: 29 }, { username: "amanda", age: 35 }, { username: "rajiv", age: 57 } ] )
-
查询初始化的数据
db.users.find()
-
创建索引,指定username字段和部分过滤器表达式age: {$gte: 21}的唯一约束。
db.users.createIndex( { username: 1 }, { unique: true, partialFilterExpression: { age: { $gte: 21 } } } )
-
索引防止了以下文档的插入,因为文档已经存在,且指定的用户名唯一和年龄字段大于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 } ] )