MongoDB 常见使用

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
简介: MongoDB 常见使用

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


image.png


  • 上面是 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 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
7月前
|
存储 NoSQL MongoDB
|
10月前
|
存储 SQL 分布式计算
MongoDB的介绍
MongoDB的介绍
57 0
|
12月前
|
SQL JSON NoSQL
老去的MongoDB,未来在哪里?
老去的MongoDB,未来在哪里?
139 0
|
NoSQL Shell Linux
|
NoSQL JavaScript 关系型数据库
MongoDB使用实际很简单
MongoDB是个文档型数据库,虽然前有CouchDB夹击,后有MySQL 8.x文档支持的追赶,但是丝毫不影响它在市场中占据的份额。
|
存储 缓存 NoSQL
初探MongoDB
MongoDB 日志 存储引擎
1252 0
|
JSON NoSQL JavaScript
|
存储 关系型数据库 数据库