今天学习了MongoDB的索引操作还有对数据库的管理。
索引
无论是在关系型数据库还是文档数据库,建立索引都是非常重要的。不过建立索引是要消耗硬盘和内存资源的,所以要根据程序需要进行建立。MongoDB也给我们进行了限制,只允许我们建立64个索引值。
建立索引
建立索引只需要一句话1
db.集合.ensureIndex({字段:1}) //字段为1表明为其建立索引
查看索引
1 | db.集合.getIndexes() |
全文索引
有些时候需要在大篇幅的文章中搜索关键词,这时候想搜索关键字是非常不容易的,索引MongoDB为我们提供了全文索引。
先在info
集合中插入两条数据
1 | db.info.insert({contentText:"I am a slow walker,but I never walk backwards."}) |
接着为其创建全文索引
1 | db.info.ensureIndex({contentText:"text"}) |
创建完成之后就可以使用索引进行内容查找了,如
1 | db.info.find({$text:{$search:"slow"}}) |
其中$text
则代表使用全文索引进行查找,$search
为需要查找的内容。
如果想要同时进行多个关键词的查找,则可以在$search
中加入新关键词同时以空格符隔开。如
1 | db.info.find({$text:{$search:"slow hides"}}) |
还可以使用减号“-”来取消某个关键词
1 | db.info.find({$text:{$search:"slow -hides"}}) |
全文搜索中是支持转义符的,比如我们想搜索的是两个词walk backwards
和hides
,这时候需要使用\
斜杠来转义。
1 | db.info.find({$text:{$search:"\"walk backwards\" hides"}}) |
管理
用户的创建与修改
安装好MongoDB时,它为我们默认开了一个最高管理权限方便我们管理数据库,我们可以用mongo链接数据库,就是这个原理。但在实际开发中并一般不能使用这个用户,因为大家都知道和最高权限的原因,安全性和可靠性都不适合,所以要对MongoDB的用户进行管理。
因此,MongoDB为我们提供了“建权”操作,即建立权限。
首先执行以下mongo命令
1 | use admin |
我们可以自己创建一个新用户而不是使用mongo。
1 | db.createUser({ |
roles
为权限设定。此处除了company数据库的权限单独设置为读写readWrite外,其余对全部数据库设为只读read。
新建完成之后,我们看一下该用户是否创建成功。使用以下命令行
1 | db.system.users.find() |
接着断开MongoDB服务器,以建权方式重新打开服务器1
mongod --auth
此时就不能直接使用mongo连接数据库了。而是需要用户名和密码登录。
1 | mongo -u tobee -p 123456 127.0.0.1:17027/admin |
-u
选项为用户名,-p
为密码,之后的为电脑IP和MongoDB占用的端口号(17027)和所需进入的数据库(admin)。
此时便可以使用自己的其他用户名与远程mongo服务器进行链接了。
以下代码可以验证用户名与密码是否一致。
1 | db.auth("tobee","123456") |
备份和还原
MongoDB的备份:mongodump。以下都是该命令的参数1
2
3
4
5
6
7
8mongodump
--host 127.0.0.1
--port 27017
--out D:/databack/backup
--collection myCollections
--db test
--username username
--password password
--host
为IP地址,--port
为端口号,--out
可将备份保存到D:/databack/backup
目录下。
比如现在我们备份所有MongoDB里的库到D盘的databack文件夹下,就可以把命令写成这样
1 | mongodump --host 127.0.0.1 --port 27017 --out D:/databack/ |
MongoDB的恢复:mongostore。以下都是该命令的参数
1 | mongorestore |
<path to the backup>
为当时保存备份的目录。
当某个已备份的集合不小心删除之后,可以使用还原语句恢复。
1 | mongorestore --host 127.0.0.1 --port 27017 D:/databack/ |
毕竟没有实际项目可以练练手,所以我也只能多看些教程和敲敲基本的代码了。keep learning~