索引属性 稀疏索引,定时索引
名字 db.collection.ensureIndex({},{name:''}) 在创建索引时,mongodb会自己给索引创建默认的名字,这种名字并不好记,我们看一下mongodb是怎么给自己命名的 唯一性: 第二个属性,是索引的唯一性 db.collection.ensureIndex({},{unique:true/false}) 如果设置为true,表明这个索引为唯一索引,及在同一个集合中不能插入两个唯一索引的字段 稀疏性: 第三个属性,是索引的稀疏性 db.collection.ensureIndex({},{sparse:true/false}) 通过设置sparse为true或者false判断索引是否稀疏,默认情况下索引是不稀疏的 是否定时删除:比如过期索引 db.test2.ensureIndex({time:1},{expireAfterSeconds:30})
sparse
假设在集合中创建了x的索引,但是由于mongodb并没有严格的结构上的限制,所以在插入文档时,这其中可能并不包含x字段,这样的情况下,mongodb依然会去创建索引,如果你不希望这件事情发生,在创建索引时,就可以用sparse=true来避免他,稀疏索引的好处时显而易见的,因为他不必为不存在的字段创建索引。
*:在使用稀疏索引时,有可能会带来一些隐患,mongodb,exixts表示是否存在
> db.test.insert({m:1}) WriteResult({ "nInserted" : 1 }) > db.test.insert({n:1}) WriteResult({ "nInserted" : 1 }) > db.test.find({m:{$exists:true}}) { "_id" : ObjectId("5b6a22e712d07a388813c246"), "m" : 1 }
插了两条数据,用exists便过滤了n
现在设置一个稀疏索引
> db.test.ensureIndex({m:1},{sparse:true}) { "createdCollectionAutomatically" : false, "numIndexesBefore" : 2, "numIndexesAfter" : 3, "ok" : 1 }
再去查找不存在m的值
> db.test.find({m:{$exists:false}}) { "_id" : ObjectId("5b6a22ea12d07a388813c247"), "n" : 1 }
过期索引,指的是一段时间后会过期的索引,在索引过期后,相应的数据会被删除,这适合存储一些在一段时间之后会失效的数据,比如用户的登录信息,想要用户登录信息2天后失效,需要用户重新登录,或者存储的日志,希望这些日志在一段时间后删除
expireAfterSeconds
建立方法
> db.test2.ensureIndex({time:1},{expireAfterSeconds:30}) { "createdCollectionAutomatically" : false, "numIndexesBefore" : 4, "numIndexesAfter" : 5, "ok" : 1 }
与普通索引不同的是,后面需要加个参数,expireAfterSecondes,他的值是秒数,用来设置过期索引的过期时间
建立好后,我们插入一条数据
> db.test2.insert({time:new Date()}) WriteResult({ "nInserted" : 1 })
再查询
> db.test2.find() { "_id" : ObjectId("5b60e31524326393d99a4f64"), "x" : 1 } { "_id" : ObjectId("5b6235d23fb2bed9140233fd"), "x" : 1, "y" : 2, "z" : 3 } { "_id" : ObjectId("5b62361e3fb2bed9140233fe"), "x" : [ 1, 2, 3, 4, 5 ] } { "_id" : ObjectId("5b623a513fb2bed9140233ff"), "time" : ISODate("2018-08-01T22:55:13.369Z") }
按照之前的设置,这条数据会在30s后删除,我们等待30s后,再看这条数据
> db.test2.find() { "_id" : ObjectId("5b60e31524326393d99a4f64"), "x" : 1 } { "_id" : ObjectId("5b6235d23fb2bed9140233fd"), "x" : 1, "y" : 2, "z" : 3 } { "_id" : ObjectId("5b62361e3fb2bed9140233fe"), "x" : [ 1, 2, 3, 4, 5 ] }
发现那条插入时间的数据已经不见了