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 聚合管道按升序向集合中的所有记录添加日期