MongoDB 索引和MySQL索引有相同的特性,甚至于所有的索引都有共同的特性:通常能够极大的提高查询的效率
索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构
_id :是一个索引
createIndex()方法
查看集合下的所有索引
db.集合名.getIndexes()
MongoDB使用 createIndex() 方法来创建索引。
单列索引
db.集合名称.createIndex(keys, 1/-1)
查看当前使用的索引信息
db.jobdesc.find({索引名:'查找内容'}).explain()
复合索引
db.colname.createIndex({key1:1,key2:-1,...})
给数组添加索引
db.jobdesc.createIndex({数组对应的键:1})
注意:查找的时候数组中的值的顺序必须一致
使用数组索引
db.colname.find({数组对应的键:['value1','value2','value3']})
索引子文档
首先我们要知道什么是子文档,子文档就是在父文档的键下在创建一个文档称为 子文档。
db.集合名称.createIndex({"父文档的值.子文档值1":1,"父文档的值.子文档值2":1,"a父文档的值.子文档值3":1})
创建全文索引
db.集合名称.ensureIndex({key:"text"})
使用全文索引
db.集合名称.find({$text:{$search:"搜索内容"}})
唯一索引:
对字段设置唯一索引时,可以保证字段都是唯一性
1.假如集合中已经存在多个相同的值,不能创建成功
2.假如成功创建唯一索引,不能重复插入
db.colname.createIndex({field:1},{unique:true})
删除索引
db.集合名称.dropIndex("IndexName")
db.集合名称.dropIndexes()
后台创建索引
db.colname.createIndex({indexname:1},{background:true})
name 给我们创建的索引起名
db.colname.createIndex({field:1},{unique:true,name:'indexname'})
sqarse 稀疏索引
因为MongoDB中集合里面可以存在不同的文档数据,那么我们在创建索引的时候,就会出现,有些文档含有索引键,有些文档没有索引键,我们可以使用 sparse 稀疏索引这个属性,如果存在索引键的文档就会创建索引,不存在索引键的文档就不会创建(索引键)对应的索引
db.集合名称.createIndex({"Key": 1}, {"unique": true, "sparse": true})
TTL日期索引
expirAfrerSeconds: 给文档设置一个过期时间,文档从插入时开始,能存活的时间,到达时间自动删除(延迟1)分钟
插入的时间会与本地(北京)时间有8小时的时差
db.colname.createIndex({field:1,filed:1,filed:1},{expirAfrerSeconds:60})
删除所有索引,(除_id外)
db.colname.dropIndexes()
重建索引
db.colname.reIndex()
db.colname.reIndexes()
为了验证我们使用使用了索引,可以使用 explain 命令
db.集合名称.find({Key:"value"}).explain()
强制索引
db.colname.find({'索引':'值'}).hint({'索引名称'}
查看集合的大小
db.集合名称.totalIndexSize()
MongoDB 索引限制
额外开销 每个索引占据一定的存储空间,在进行插入,更新和删除操作时也需要对索引进行操作。所以,如果你很少对集合进行读取操作,建议不使用索引。
内存(RAM)使用 由于索引是存储在内存(RAM)中,你应该确保该索引的大小不超过内存的限制。 如果索引的大小大于内存的限制,MongoDB会删除一些索引,这将导致性能下降。
查询限制 索引不能被以下的查询使用: 正则表达式及非操作符,如 $nin, $not, 等。 算术运算符,如 $mod, 等。
索引键限制 从2.6版本开始,如果现有的索引字段的值超过索引键的限制,MongoDB中不会创建索引。
插入文档超过索引键限制 如果文档的索引字段值超过了索引键的限制,MongoDB不会将任何文档转换成索引的集合。
最大范围 集合中索引不能超过64个 索引名的长度不能超过128个字符 一个复合索引最多可以有31个字段
权限管理
了更安全的访问mongodb,需要访问者提供用户名和密码,于是需要在mongodb中创建用户
一般只有三种权限
root:只在admin数据库中可用,超级账号,超级权限
Read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
创建超级管理用户
use admin
db.createUser(
{
user:'admin',
pwd:'123',
roles:[{role:'root',db:'admin'}]
}
)
创建成功后退出mongodb客户端, 然后service mongodb stop, 再开启安全认证,
启用安全认证
进入配置文件并修改sudo vi /etc/mongod.conf
启用身份验证
方式一:新版本 注意:keys and values之间一定要加空格, 否则解析会报错 security: authorization: enabled
方式二:较低版本 或者修改配置文件将auth=true前面的注释拿掉然后保存并退出
最后: 重新启动mongodb
登录
mongo -u 'ljh' -p 'ljh123' --authenticationDatabase generalUser
创建普通用户同理,只不过给的权限没有这么多
修改普通用户权限或密码
修改用户:可以修改pwd、roles属性
注意这里只有超级管理员才有权限修改普通用户的密码和管理权限
db.updateUser(‘ljh',{pwd:'456'})
同样的MongoDb也有备份恢复这种个命令。
只不过我在进行操作的时候已经创建了用户,已经有了权限,所没有测试没有权限的方法。
无权限
mongodump -h dbhost -d dbname -o dbdirectory
-h: MongDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017
-d: 需要备份的数据库实例,例如:test
-o: 备份的数据存放位置,例如:c:\data\dump,当然该目录需要提前建立,在备份完成后,系统自动在dump目录下建立一个test目录,这个目录里面存放该数据库实例的备份数据。
有权限
mongodump -h 127.0.0.1 -d admin -o /home/ln/p1804/04/14
恢复
无权限
mongorestore -h 127.0.0.1:27017 -d 数据库名称 --dir ~/Desktop/数据库备份的路径
有权限
mongodump -u 'lwy' -p '12345' --authenticationDatabase 'admin' -d jobs --dir bak/jobs