• 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')
    
    
  • 相关阅读:
    小波变换的引入,通俗易懂
    Leetcode 437. Path Sum III
    Leetcode 113. Path Sum II
    Leetcode 112 Path Sum
    Leetcode 520 Detect Capital
    Leetcode 443 String Compression
    Leetcode 38 Count and Say
    python中的生成器(generator)总结
    python的random模块及加权随机算法的python实现
    leetcode 24. Swap Nodes in Pairs(链表)
  • 原文地址:https://www.cnblogs.com/gongjingyun123--/p/12088297.html
Copyright © 2020-2023  润新知