Mongo--02 命令介绍

时间:2019-12-23
本文章向大家介绍Mongo--02 命令介绍,主要包括Mongo--02 命令介绍使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

Mongo工具

1. 查看指令

test:登录时默认存在的库
admin库:系统预留库,MongoDB系统管理库
local库:本地预留库,存储关键日志
config库:MongoDB配置信息库

查看数据库命令
show databases/show dbs
show tables/show collections
use admin
db/select database()

2.插入命令

1.插入单条
db.user_info.insert({"name":"zhangya","age":27,"ad":"北京市朝阳区"})
db.user_info.insert({"name":"zhangya","age":27,"ad":"北京市朝阳区"})
db.user_info.insert({"name":"yazhang","age":28,"ad":"北京市朝阳区"})
db.user_info.insert({"name":"xiaozhang","age":28,"ad":"北京市朝阳区"})
db.user_info.insert({"name":"xiaozhang","age":28,"ad":"北京市朝阳区","sex":"boy"})


2.插入多条
db.inventory.insertMany( [
    { "item": "journal", "qty": 25, "size": { "h": 14, "w": 21, "uom": "cm" }, "status": "A" },
    { "item": "notebook", "qty": 50, "size": { "h": 8.5, "w": 11, "uom": "in" }, "status": "A" },
    { "item": "paper", "qty": 100, "size": { "h": 8.5, "w": 11, "uom": "in" }, "status": "D" },
    { "item": "planner", "qty": 75, "size": { "h": 22.85, "w": 30, "uom": "cm" }, "status": "D" },
    { "item": "postcard", "qty": 45, "size": { "h": 10, "w": 15.25, "uom": "cm" }, "status": "A" }
]);

3.查询命令

#输入db.user_info.之后table键可以查看支持的函数
> db.user_info.
db.user_info.addIdIfNeeded(
db.user_info.aggregate(
db.user_info.bulkWrite(
db.user_info.constructor
db.user_info.convertToCapped(
db.user_info.convertToSingleObject(
db.user_info.copyTo(
db.user_info.count(
db.user_info.createIndex(
db.user_info.createIndexes(
db.user_info.dataSize(
db.user_info.deleteMany(
db.user_info.deleteOne(
db.user_info.diskStorageStats(
db.user_info.distinct(
db.user_info.drop(
db.user_info.dropIndex(
db.user_info.dropIndexes(
db.user_info.ensureIndex(
db.user_info.exists(
db.user_info.explain(
db.user_info.find(
db.user_info.findAndModify(
db.user_info.findOne(
db.user_info.findOneAndDelete(
db.user_info.findOneAndReplace(
db.user_info.findOneAndUpdate(
db.user_info.getCollection(
db.user_info.getDB(
db.user_info.getDiskStorageStats(
db.user_info.getFullName(

查询命令总结:

1.查询一条
db.user_info.findOne()

2.查询所有
db.user_info.find()

3.查询符合条件
db.user_info.find({"age":28})
#相当于mysql中的命令
select * from user_info where age = 28;

4.查询嵌套的条件
db.inventory.find( { "size.uom": "in" } )
#json格式如下:
db.inventory.find( 
    { 
        "size.uom": "in" 
    } 
)

5.逻辑查询:and
db.inventory.find( { "size.uom": "cm" ,"status" : "A"} )
#json格式如下:
db.inventory.find( 
    { 
        "size.uom": "cm" ,
        "status" : "A"
    } 
)

6.逻辑查询 或
db.inventory.find(
    {
        $or:[
                {status:"D"},
                {qty:{$lt:30}}
            ]
    }
)

7.逻辑查询+或+and+正则表达式
db.inventory.find({status:"A",$or:[{qty:{$lt:30}},{item:/^p/}]})
#json格式如下:
db.inventory.find( 
    {
        status: "A",
        $or: [ 
                { qty: { $lt: 30 } }, 
                { item: /^p/ } 
             ]
    } 
)

4.更新数据

1.更改匹配条件的单条数据

如:
#查询
> db.inventory.find({ "item" : "paper" })
{ "_id" : ObjectId("5dfa03a490425c3c47b6b8cf"), "item" : "paper", "qty" : 100, "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "status" : "D" }

#更新
> db.inventory.updateOne(
...     { "item" : "paper" },
...     {
...       $set: {  
... "size.uom" : "cm",  
... "status" : "P" 
... }
...     }
... )
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }

#再次查询
> db.inventory.find({ "item" : "paper" })
{ "_id" : ObjectId("5dfa03a490425c3c47b6b8cf"), "item" : "paper", "qty" : 100, "size" : { "h" : 8.5, "w" : 11, "uom" : "cm" }, "status" : "P" }

2.更改匹配条件的多条数据

#查询qty并且值小于50的
> db.inventory.find({ "qty" : { $lt: 50 } })
{ "_id" : ObjectId("5dfa03a490425c3c47b6b8cd"), "item" : "journal", "qty" : 25, "size" : { "h" : 14, "w" : 21, "uom" : "m" }, "status" : "A" }
{ "_id" : ObjectId("5dfa03a490425c3c47b6b8d1"), "item" : "postcard", "qty" : 45, "size" : { "h" : 10, "w" : 15.25, "uom" : "m" }, "status" : "A" }

#修改uom 对应的值为mm,status对应的值为P
> db.inventory.updateMany(
...     { "qty" : { $lt: 50 } },
...     {
...        $set: 
... { 
... "size.uom" : "mm", 
... "status": "P" 
... }
...     }
... )
{ "acknowledged" : true, "matchedCount" : 2, "modifiedCount" : 0 }

#再次查询,可以看到改变
> db.inventory.find({ "qty" : { $lt: 50 } })
{ "_id" : ObjectId("5dfa03a490425c3c47b6b8cd"), "item" : "journal", "qty" : 25, "size" : { "h" : 14, "w" : 21, "uom" : "mm" }, "status" : "P" }
{ "_id" : ObjectId("5dfa03a490425c3c47b6b8d1"), "item" : "postcard", "qty" : 45, "size" : { "h" : 10, "w" : 15.25, "uom" : "mm" }, "status" : "P" }

3.添加字段

#查询
> db.user_info.find({ "age" : 27})
{ "_id" : ObjectId("5dfa035e90425c3c47b6b8ca"), "name" : "zhangya", "age" : 27, "ad" : "北京市朝阳区"}
#添加字段
> db.user_info.updateMany(
...     { "age" : 27},
...     {
...        $set: 
... { 
... "pet" : "cat"
... }
...     }
... )
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 0 }
#再次查询
> db.user_info.find({ "age" : 27})
{ "_id" : ObjectId("5dfa035e90425c3c47b6b8ca"), "name" : "zhangya", "age" : 27, "ad" : "北京市朝阳区", "pet" : "cat" }

5.索引

1.查看执行计划
db.user_info.find({"age":{ $lt: 30 }})
#加上explain查询
db.user_info.find({"age":{ $lt: 30 }}).explain()

2.创建索引(给age创建索引,background:true 意思是放在后台执行这个集合)
> db.user_info.createIndex({ age: 1 },{background: true})
{
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "note" : "all indexes already exist",
    "ok" : 1
}


3.查看索引,会发现多了一个索引
> db.user_info.getIndexes()
[
    {
        "v" : 2,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.user_info"
    },
    {
        "v" : 2,
        "key" : {
            "age" : 1
        },
        "name" : "age_1",
        "ns" : "test.user_info",
        "background" : true
    }
]


4.再次查看执行计划
>db.user_info.find({"age":{ $lt: 30 }}).explain()
...
#结果中有出现IXSCAN
    "inputStage" : {
                "stage" : "IXSCAN",
                "keyPattern" : {
                    "age" : 1
                },
                "indexName" : "age_1",
...
关键词
"stage" : "IXSCAN"
"indexName" : "age_1"

其他索引类型
COLLSCAN – Collection scan  (类似于mysql的全表扫描)
IXSCAN – Scan of data in index keys  (走索引)
FETCH – Retrieving documents
SHARD_MERGE – Merging results from shards
SORT – Explicit sort rather than using index orde

5.删除

1.先查找需要删除的数据
> db.inventory.find({"status":"P"})
{ "_id" : ObjectId("5dfa03a490425c3c47b6b8cd"), "item" : "journal", "qty" : 25, "size" : { "h" : 14, "w" : 21, "uom" : "mm" }, "status" : "P" }
{ "_id" : ObjectId("5dfa03a490425c3c47b6b8cf"), "item" : "paper", "qty" : 100, "size" : { "h" : 8.5, "w" : 11, "uom" : "cm" }, "status" : "P" }
{ "_id" : ObjectId("5dfa03a490425c3c47b6b8d1"), "item" : "postcard", "qty" : 45, "size" : { "h" : 10, "w" : 15.25, "uom" : "mm" }, "status" : "P" }


2.删除单条deleteOne
db.inventory.deleteOne({"status":"P"})

3.删除多个deleteMany
db.inventory.deleteMany({"status":"P"})

4.删除索引
db.user_info.dropIndex("age_1")

4.删除集合
#查看
> show tables
inventory
user_info
#删除集合
> db.inventory.drop()
true
#再次查看
> show tables
user_info

5.删除库
#查看库
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
test    0.000GB
#当前所在的库
> db
test
#删除当前所在的库
> db.dropDatabase()
{ "dropped" : "test", "ok" : 1 }
#再次查看
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB

6.mongo命令介绍

mongod          #启动命令
mongo           #登录命令         
mongodump       #备份导出,全备压缩
mongorestore    #备份恢复
mongoexport     #备份,数据可读json(适用于单个集合)
mongoimport     #备份恢复
mongostat       #查看mongo运行状态
mongotop        #查看mongo运行状态
mongos          #集群分片命令

.mongostat状态解释

[mongo@db01 ~]$ mongostat
insert query update delete getmore command dirty used flushes vsize   res qrw arw net_in net_out conn                time
    *0    *0     *0     *0       0     1|0  0.0% 0.0%       0  974M 46.0M 0|0 1|0   157b   60.6k    1 Dec 19 00:55:32.632
    *0    *0     *0     *0       0     1|0  0.0% 0.0%       0  974M 46.0M 0|0 1|0   157b   60.5k    1 Dec 19 00:55:33.633


#各字段解释说明:
insert/s : 官方解释是每秒插入数据库的对象数量,如果是slave,则数值前有*,则表示复制集操作
query/s : 每秒的查询操作次数
update/s : 每秒的更新操作次数
delete/s : 每秒的删除操作次数
getmore/s: 每秒查询cursor(游标)时的getmore操作数
command: 每秒执行的命令数,在主从系统中会显示两个值(例如 3|0),分表代表 本地|复制 命令
注: 一秒内执行的命令数比如批量插入,只认为是一条命令(所以意义应该不大)
dirty: 仅仅针对WiredTiger引擎,官网解释是脏数据字节的缓存百分比
used:仅仅针对WiredTiger引擎,官网解释是正在使用中的缓存百分比

flushes:
For WiredTiger引擎:指checkpoint的触发次数在一个轮询间隔期间
For MMAPv1 引擎:每秒执行fsync将数据写入硬盘的次数
注:一般都是0,间断性会是1, 通过计算两个1之间的间隔时间,可以大致了解多长时间flush一次。flush开销是很大的,如果频繁的flush,可能就要找找原因了
vsize: 虚拟内存使用量,单位MB (这是 在mongostat 最后一次调用的总数据)
res:  物理内存使用量,单位MB (这是 在mongostat 最后一次调用的总数据)
注:这个和你用top看到的一样, vsize一般不会有大的变动, res会慢慢的上升,如果res经常突然下降,去查查是否有别的程序狂吃内存。

qr: 客户端等待从MongoDB实例读数据的队列长度
qw:客户端等待从MongoDB实例写入数据的队列长度
ar: 执行读操作的活跃客户端数量
aw: 执行写操作的活客户端数量
注:如果这两个数值很大,那么就是DB被堵住了,DB的处理速度不及请求速度。看看是否有开销很大的慢查询。如果查询一切正常,确实是负载很大,就需要加机器了
netIn:MongoDB实例的网络进流量
netOut:MongoDB实例的网络出流量
注:此两项字段表名网络带宽压力,一般情况下,不会成为瓶颈
conn: 打开连接的总数,是qr,qw,ar,aw的总和
注:MongoDB为每一个连接创建一个线程,线程的创建与释放也会有开销,所以尽量要适当配置连接数的启动参数,maxIncomingConnections,阿里工程师建议在5000以下,基本满足多数场景

7.创建用户和角色

#与用户相关的命令
db.auth() 将用户验证到数据库。
db.changeUserPassword() 更改现有用户的密码。
db.createUser() 创建一个新用户。
db.dropUser() 删除单个用户。
db.dropAllUsers() 删除与数据库关联的所有用户。
db.getUser() 返回有关指定用户的信息。
db.getUsers() 返回有关与数据库关联的所有用户的信息。
db.grantRolesToUser() 授予用户角色及其特权。
db.removeUser() 已过时。从数据库中删除用户。
db.revokeRolesFromUser() 从用户中删除角色。
db.updateUser() 更新用户数据。

1.创建管理用户

mongo db01:27017
#先进到admin库
use admin 
#先查看用户(当前没有用户)
> db.getUsers()
[ ]
#创建用户
db.createUser(
    {
        user: "admin",
        pwd: "123456",
        roles:[ 
                { 
                    role: "root", 
                    db:"admin"
                }
              ]
    }   
)

2.查看创建的用户

> db.getUsers()
[
    {
        "_id" : "admin.admin",
        "userId" : UUID("b056b2c5-705b-49bc-9b5f-c6d7d295501d"),
        "user" : "admin",
        "db" : "admin",
        "roles" : [
            {
                "role" : "root",
                "db" : "admin"
            }
        ]
    }
]

3.退出,配置文件添加权限认证参数

[mongo@db01 ~]$ tail -2 /opt/mongo_27017/conf/mongodb.conf 
security:     
  authorization: enabled

4.重启mongo

[mongo@db01 ~]$  mongod -f /opt/mongo_27017/conf/mongodb.conf --shutdown
[mongo@db01 ~]$  mongod -f /opt/mongo_27017/conf/mongodb.conf

5.使用admin用户登录

[mongo@db01 ~]$  mongo db01:27017 -uadmin -p --authenticationDatabase admin

6.创建其他用户

>use test
>db.createUser(
  {
    user: "mysun",
    pwd: "123456",
    roles: [ { role: "readWrite", db: "write" },
             { role: "read", db: "read" } ]
  }
)

7.创建测试数据

>use write
>db.write.insert({"name":"zhangya","age":27,"ad":"北京市朝阳区"})
db.write.insert({"name":"zhangya","age":27,"ad":"北京市朝阳区"})
db.write.insert({"name":"yazhang","age":28,"ad":"北京市朝阳区"})
db.write.insert({"name":"xiaozhang","age":28,"ad":"北京市朝阳区"})
db.write.insert({"name":"xiaozhang","age":28,"ad":"北京市朝阳区","sex":"boy"})

>use read
>db.read.insert({"name":"zhangya","age":27,"ad":"北京市朝阳区"})
db.read.insert({"name":"zhangya","age":27,"ad":"北京市朝阳区"})
db.read.insert({"name":"yazhang","age":28,"ad":"北京市朝阳区"})
db.read.insert({"name":"xiaozhang","age":28,"ad":"北京市朝阳区"})
db.read.insert({"name":"xiaozhang","age":28,"ad":"北京市朝阳区","sex":"boy"})

8.退出admin,使用mysun用户登录

[mongo@db01 ~]$ mongo db01:27017 -umysun -p --authenticationDatabase test

#普通mysun用户登录,write库,可读可写
>use write
> db.write.find()
> db.write.insert({"name":"zhangya","age":27,"ad":"北京市朝阳区"})

#read库,只可读,写的话会报错
> use read
switched to db read
> db.read.find()
> db.read.insert({"name":"zhangya","age":27,"ad":"北京市朝阳区"})

9.修改用户权限,必须以admin的用户登录,普通用户修改不了

use test
db.updateUser(
  'mysun',
  { 
    pwd: "123456",
    roles: [ { role: "readWrite", db: "write" },
             { role: "readWrite", db: "read" } ,
             { role: "readWrite", db: "test" }
             ]
             
  }
)

10.删除用户,也必须以admin的用户登录

db.getUsers()
db.dropUser('mysun')

原文地址:https://www.cnblogs.com/gongjingyun123--/p/12088297.html