MongoDB 常见使用

Posted 愿许浪尽天涯

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 信息说明:

输出信息说明
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>)

以上是关于MongoDB 常见使用的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB按“数字”升序排列

使用 mongodb 聚合管道按升序向集合中的所有记录添加日期

使用mongoose在mongodb中按升序和降序对多个字段进行排序

MongoDB升序/降序定位错误值

Spark教程Spark连接MongoDB

Docker常见仓库MongoDB