MongoDB 常见使用
一、MongoDB 安全配置
二、索引配置
三、慢查询
一、MongoDB 安全配置
因为博主前面写过 MongoDB 安装教程,所以这里便不再进行安装(未安装的可以看:MongoDB 使用介绍)
1)创建 MongoDB 管理员用户
[root@MongoDB ~]# mongo 192.168.1.1:27017 use admin db.createUser( { user: "admin", pwd: "123123", roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] } ) db.getUsers() # 查看当前库用户
验证:
- 当我们要是通过用户名和密码来使用 MongoDB 时,需要加上 --authenticationDatabase 配置来指定授权库。
[root@MongoDB ~]# mongo -u "admin" -p "123123" 192.168.1.1:27017 --authenticationDatabase "admin" > show dbs; # 查看所有库 admin 0.000GB config 0.000GB local 0.000GB > db.getName() # 查看当前所在库 test
2)基于原有用户增加权限
> use admin > db.grantRolesToUser("admin",[{role:"root",db:"admin"}]) > db.system.users.find() # 查看 MongoDB 中所有用户
- 撤销权限:将 db.grantRolesToUser 换成 db.revokeRolesFromUser 即可。
3)开启 MongoDB 安全配置
- 开启后,所有用户都需要通过定义的角色来使用 MongoDB 数据库。
[root@MongoDB ~]# echo "auth=true" >> /usr/local/mongodb/conf/mongodb.conf [root@MongoDB ~]# /etc/init.d/mongodb restart [root@MongoDB ~]# mongo 192.168.1.1:27017 > show dbs; > db.getName() test > db.auth('admin','123123') 1 > show dbs; admin 0.000GB config 0.000GB local 0.000GB
可以看到,当我们开启 MongoDB 安全配置后,要是不使用定义的角色来连接 MongoDB 数据库,便只能连接 test 库。
4)角色权限说明
- Read:仅可以读指定的库;
- readWrite:可以读写指定的库;
- dbAdmin:允许用户在指定的数据库中执行/管理函数,如:索引创建、删除,查询统计或访问 system.profile;
- userAdmin 用户管理员,允许用户向 system.users 集合写入,可以在指定库创建、删除和管理用户。
下面角色仅在 admin 库中可用:
- readAnyDatabase:仅可以读所有库;
- userWriteAnyDatabase:可以读写所有库;
- clusterAdmin:允许用户管理所有分片和副本集的相关函数;
- dbAdminAnyatabase:允许用户在所有库中执行/管理函数;
- userAdminAnyDatabsae:允许用户在所有库创建、删除和管理用户;
- root:超级账号(史上最强,无可匹敌)
二、索引配置
当我们在 MongoDB 查询数据时,如果没有加索引,那么 MongoDB 便会通过扫描整个 Collection (集合) 来查询数据。数据量少还好,但要是数据量很大,并且服务器的配置也比较低,那么可能会导致 MQ 消费速度下降,以及 MongoDB 性能不佳等情况。
上面所说的,可能会导致 MQ 消费速度下降,原因是因为有些业务场景:MQ 需要通过在 MongoDB 里进行查询操作。
1)MongoDB 基本命令使用
[root@MongoDB ~]# mongo -u "admin" -p "123123" 192.168.1.1:27017 --authenticationDatabase "admin" > use test > db.CSDN.insert( { "ID": 10, "name": "愿许浪尽天涯" } ) # 创建 CSDN 集合 WriteResult({ "nInserted" : 1 }) > show collections # 查询集合 CSDN > db.CSDN.find() # 查询 CSDN 集合内的所有内容 { "_id" : ObjectId("626e00fa5680caf3ba8ef38d"), "ID" : 10, "name": "愿许浪尽天涯" } > db.CSDN.count() # 查询 CSDN 集合内所有内容的条数 1 > db.CSDN.findOne( { "ID": 10 } ) # 通过 Key-Value 查询 { "_id" : ObjectId("626e00fa5680caf3ba8ef38d"), # _id(自带的唯一索引,防止出现相同的 ObjectId) "ID" : 10, "name": "愿许浪尽天涯" }
2)创建索引:db.collection.createIndex()
> db.CSDN.createIndex( { "ID": 1 } ) # 1 表示升序,-1 表示降序
- 在 MongoDB 3.0 前,可以通过 ensureIndex 的方式来创建索引,现在依旧可以,但效果和 createIndex 相同。
3)查看索引:db.collection.getIndexes()
> db.CSDN.getIndexes()
上面我们创建的索引,叫做 单字段索引,这个索引对于升序降序并不重要,因为 MongoDB 可以从任何方向遍历索引。但是当我们对多个字段创建索引时,便要叫做 复合索引,此时对于升序降序便有了重要意义。
> db.CSDN.insert( { "ID": 10, "score": 38 } ) ... > db.CSDN.insert( { "ID": 20, "score": 68 } ) ... > db.CSDN.insert( { "ID": 20, "score": 38 } ) ...
4)创建复合索引
> db.CSDN.createIndex( { "ID": 1, "score": -1 } ) ... > db.CSDN.find().sort( { "ID": 1, "score": -1 } ) { "_id" : ObjectId("6270fe99368db70861d1f568"), "ID" : 10, "score" : 38 } { "_id" : ObjectId("6270fe80368db70861d1f567"), "ID" : 10, "name" : "愿许浪尽天涯" } { "_id" : ObjectId("6270fe9e368db70861d1f569"), "ID" : 20, "score" : 68 } { "_id" : ObjectId("6270ff0f368db70861d1f56a"), "ID" : 20, "score" : 38 }
先通过 ID 进行升序,再通过 score 进行倒序,这里需要注意:当我们在进行排序时,如果值不同,那么排序的顺序也会有所不同。
由于 MongoDB 的索引有很多,所以博主这里不做过多介绍,感兴趣的小伙伴可以看:官方说明
三、慢查询
1)查看当前慢查询是否开启
> db.getProfilingLevel() # 查看当前库的慢查询级别 0 > db.getProfilingStatus() { "was" : 0, "slowms" : 100, "sampleRate" : 1 }
- was:0,不开启。1,开启慢查询。2,显示所有查询。
- slowms:慢查询时间 (单位:ms,默认为 10 秒);
2)开启慢查询
> db.setProfilingLevel(2, 10) { "was" : 0, "slowms" : 100, "sampleRate" : 1, "ok" : 1 }
上面我们把慢查询级别改为显示所有查询,平常使用的话开启慢查询即可,不用显示所有查询(不然量太大)
3)查看慢查询命令
> db.system.profile.find()
Profile 信息说明:
- 上面是 MongoDB 输出的部分信息,详细信息见:官方说明
4)查看当前正在运行的语句
> db.currentOP()
输出信息:
- opid:操作 ID。
- active:操作是否处于活动状态。
- secs_running:操作运行时间。
- op:操作类型。
- ns:操作的库.集合。
- query:操作语句。
- threadId:线程 ID。
- connectionId:数据库连接 ID。
- locks:锁的相关信息。
5)终止当前正在运行的语句
db.killOp(<opid of the query to kill>)