zoukankan      html  css  js  c++  java
  • MongoDB笔记01——基础操作

    MongoDB基础操作

    一、初始化环境和用户

    rs.initiate({_id:'rs0',members:[{_id:1,host:'192.168.1.100:27017'}]});
    
    #创建root账号
    use admin;
    db.createUser({
    	user:"root",pwd:"123456",
    	roles: [{role:"userAdminAnyDatabase",db:"admin"},{role:"clusterAdmin",db:"admin"},{role:"root",db:"admin"}, "readWriteAnyDatabase" ]
    });
    db.auth("root","123456");
    
    
    #创建普通账号
    use proj_dev;
    db.createUser({
    	user:"proj",pwd:"123456",
    	roles: [{role:"dbAdmin",db:"proj_dev"},{role:"readWrite",db:"proj_dev"}]
    });
    db.auth("proj","123456");
    
    #授权
    db.grantRolesToUser("proj",[{role:"dbAdmin",db:"proj_test"},{role:"readWrite",db:"proj_test"}]);
    
    #查询所有用户
    db.system.users.find().pretty();
    
    #删除用户
    db.system.users.remove({user:"proj"})
    
    #修改密码
    db.changeUserPassword('proj','123456789'); 
    
    
    
    roles 用户角色:
    1. 数据库用户角色:read、readWrite;
    2. 数据库管理角色:dbAdmin、dbOwner、userAdmin;
    3. 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
    4. 备份恢复角色:backup、restore;
    5. 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
    6. 超级用户角色:root 
    
    Read:允许用户读取指定数据库
    readWrite:允许用户读写指定数据库
    dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
    userAdmin:允许用户向system.users集合写入,可以在指定数据库里创建、删除和管理用户
    clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
    readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
    readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
    userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
    dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
    root:只在admin数据库中可用。超级账号,超级权限
    

    二、常用简单语句

    show dbs;--显示当前数据库服务上的数据库
    use projdb --切换到指定的数据库进行操作
    show collections;--显示当前数据库的所有集合
    db.serverStatus(); --查看数据库服务的状态
    db.stat() --查询指定数据库的统计信息
    db.getCollectionNames() --查询指定数据库包含的集合名称列表
    db.proj_data.count() --统计集合记录数
    db.proj_data.find({"projectCode":"1001"}).count() --统计指定条件的记录数
    db.proj_data.storageSize() --查询指定数据库的集合当前可用的存储空间
    db.test1.totalSize() --查询指定数据库的集合分配的存储空间
    
    
    
    db.dropDatabase() --删除数据库
    db.proj_data.insert({"projectCode":"1001"}) --插入数据,也可以使用save
    db.proj_data.remove({"projectCode":"1001"}) --删除指定条件记录
    db.proj_data.ensureIndex({"projectCode":1,"createdDate":-1}) --创建索引,数字1表示升序,-1表示降序
    db.proj_data.ensureIndex({"projectCode":1},{background:1}) --超大表创建索引,加入background,防止长时间占用锁
    db.proj_data.getIndexes() --查询索引
    db.proj_data.dropIndexes() --删除所有的索引
    db.proj_data.dropIndex("projectCode_1") --根据索引名称进行删除
    db.proj_data.reIndex() --重建索引
    
    
    #mongo --eval 运行一段脚本
    ./mongo 127.0.0.1:27017/testdb -utest -p123456 --eval "printjson(db.proj_data.findOne())"
    
    #在OS命令行下,运行一个js文件
    /usr/local/mongodb/bin/mongo 127.0.0.1:27017/testdb -utest -p123456 /usr/local/mongodb/scripts/hello.js >> out.log
    
    #shell执行js脚本
    rs0:PRIMARY> load('hello.js') --直接执行当前目录下mongo-js脚本
    rs0:PRIMARY> load('/usr/local/mongodb/scripts/hello.js') ----直接执行绝对路径mongo-js脚本
    
    #把二进制格式文件bson转换为json格式
    /usr/local/mongodb/bin/bsondump --quiet abc.bson --outFile abc.json
    

    三、业务场景语句

    db.help() -- 查看数据级别的帮助
    db.mycollection.help() --查看集合级别的帮助
    rs.help() --查看副本集的帮助
    sh.help() --查看分片的帮助
    
    #备份mongodb单个集合
    db.supplier_data.find({}).forEach(function(x){db.supplier_data_bak2019010101.insert(x)});
    db.proj_data.renameCollection("proj_data_2020010101") --集合重命名 也可用于做备份
    
    #根据条件将集合数据迁移到另一个集合中
    db.proj_data.find({
        'props.proVersionId.value': '100000000000001'
    }).forEach(function(project) {
        db.proj_data_history.insert(project);      
    });
    db.proj_data.remove({'props.projVersionId.value':'100000000000001'});
    
    
    #根据条件更新部分集合属性值
    db.supplier_data.update({sn:'0000000001'},
    {$set:{sn:'0000000002','props.lifnr.value':'0000000002'}});
    db.supplier_data.update({sn:'0000000001'},
    {$set:{sn:'0000000002','props.lifnr.value':'0000000002'}},{multi:true});
    
    #根据条件把全角替换为半角
    db.merchant_data.find({
        $or: 
        [
            {'props.merchantName.value': {$regex: /(/}},
            {'props.merchantName.value': {$regex: /)/}}
        ]
    }).forEach(function(item) {
        var merchantName_new = item.props.merchantName.value.replace(/(/g, "(").replace(/)/g, ")");
        db.merchant_data.update({_id: item._id}, {
            $set: {'props.merchantName.value': merchantName_new}
        });
    });
    
    
    #将语句保存到js格式文件,由于mongodb在4.2及以上版本以上不支持eval,只能通过shell执行js
    (function f(){
    	var data = {"1001":"abc", "1002":"def"};
    	for(var snVal in data) {
    		var propVal = data[snVal];
    		db.merchant_data.update({sn:snVal},{$set:{'props.providerName.value':propVal}});
    		db.merchant_data_history.update({sn:snVal},{$set:{'props.providerName.value':propVal}});
    	}	
    })();
    
    
    #Aggregation示例01
    db.proj_data.aggregate([
        {
            $match: {
                'props.projectCode.value': "1001"
            }
        },
        {
            $group: {
                _id: "$props.phase.value",
                "projectVersionId": {
                    $first: "$props.projectVersionId.value"
                }
            }
        },
        {
            $sort: {
                "dataVersion": - 1
            }
        }
    ]).forEach(function(row) {
        //TODO
    });
    
    
    #Aggregation示例02
    function computeProjtDevStatus(projVersionId) {
    	var result = [];
    	db.getCollection('stage_data').aggregate([
    				{$match: {"props.projVersionId.value": projVersionId}},
    				{
    						$project: {
    								_id: 1,
    								"props.projVersionId.value": 1,
    								"props.devStatus.value":1,
    								 nowDate:{$dateToString:{format:"%Y-%m-%d", date:new Date()}},
    								 devStatus1801Y:{$cond:{if:{$eq:["$props.devStatus.value",'1801']},then:1,else:0}},
    								 devStatus1802Y:{$cond:{if:{$eq:["$props.devStatus.value",'1802']},then:1,else:0}}
    						}
    				},
    					{
    						$group: {
    								_id: "$props.projectVersionId.value",
    								nowDate: {$first:'$nowDate'},
    								total:{$sum:1},
    								devStatus1801YNum:{$sum:'$devStatus1801Y'},
    								devStatus1802YNum:{$sum:'$devStatus1802Y'}
    						}
    				}
    		]).forEach(function(row) {
    			//TODO 
    		});
    		
    	return result;
    }
    
    
    #mapreduce示例
    MongoDB JavaScript复杂批处理方案:Map Reduce和Aggregation
    https://docs.mongodb.com/manual/tutorial/map-reduce-examples/
    
    db.runCommand(
       {
            mapreduce: "stage_data_new",
            map: function() {
                emit(this.props.stageName.value, {
                    totalUseArea: this.props.totalUseArea.value,
                    totalBuildingArea: this.props.totalBuildingArea.value
               });
           },
            reduce: function(key, values) {
                var reduced = {
                    totalUseArea: 0,
                    totalBuildingArea: 0
               };
                
                values.forEach(function(val) {
                    reduced.totalUseArea += val.totalUseArea;
                    reduced.totalBuildingArea += val.totalBuildingArea;
               });
                return reduced;
           },
            finalize: function(key, reducedVal) {
                return reducedVal;
           },
            query: {
                "props.projVersionId.value": '100000000000001'
           },
            out: "mrout_stage_data_new"
       }
    );
    
    db.mrout_stage_data_new.find().forEach(function(x) {
        db.proj_data_new.update({
            '_id': '100000000000001'
       }, {
            $set: {
                'props.totalUseArea.value': x.value.totalUseArea,
                'props.totalBuildingArea.value': x.value.totalBuildingArea
           }
       });
    });
    

    四、备份和恢复

    Linux下备份
    /usr/local/mongodb/bin/mongodump --port 27017 -d proj_dev -o ./proj_dev_20200101 -u proj -p 123456
    
    Windows下备份
    "C:/Program Files/MongoDB/Server/4.2/bin/mongodump" --host 192.168.1.100 --port 27017 -d proj_dev_20200101 -o ./proj_dev_20200101 -u proj -p 123456
    
    
    Linux下恢复
    /usr/local/mongodb/bin/mongorestore -u proj -h localhost:27017 -d proj_dev  /mdata/sql/proj_dev_20200101/proj_dev/
    
    
    Windows下恢复
    "C:/Program Files/MongoDB/Server/4.2/bin/mongorestore" -u proj -p 123456 -h 192.168.1.100:27017 -d proj_dev "D:/backup/mongodb/proj_dev_20200101/proj_dev/"
    

    五、参考资料

    https://www.runoob.com/mongodb/mongodb-tutorial.html

  • 相关阅读:
    跨域(六)——window.name
    跨域(五)——postMessage
    跨域(四)——document.domain
    跨域(三)——JSONP
    Web安全颜色
    跨域(二)——WebSocket
    Win7下npm命令Error: ENOENT问题解决
    跨域(一)——CORS机制
    父组件传值给孙组件
    vue使用bus进行兄弟组件传值
  • 原文地址:https://www.cnblogs.com/huligong1234/p/12489766.html
Copyright © 2011-2022 走看看