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 信息说明:

输出信息说明
op操作类型
ns慢查询对应的库.集合
query慢查询语句
millis慢查询运行时长
ts慢查询开始时间
client客户端连接的 IP 地址或主机名
allUsers客户端连接使用的用户名和库
  • 上面是 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>)
  • 18
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

愿许浪尽天涯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值