zoukankan      html  css  js  c++  java
  • 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')
    
    
  • 相关阅读:
    预处理与编译阶段
    联合体
    linux shell
    二维数组、字符数组、指针数组涉及字符串和具体元素问题
    二级指针的简单运用
    halcon算子翻译——get_image_type
    halcon算子翻译——get_image_time
    halcon算子翻译——get_image_size
    Halcon算子翻译——get_image_pointer3
    Halcon算子翻译——get_image_pointer1_rect
  • 原文地址:https://www.cnblogs.com/gongjingyun123--/p/12088297.html
Copyright © 2011-2022 走看看