• 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

  • 相关阅读:
    Java实现 蓝桥杯 算法训练 画图(暴力)
    Java实现 蓝桥杯 算法训练 画图(暴力)
    Java实现 蓝桥杯 算法训练 相邻数对(暴力)
    Java实现 蓝桥杯 算法训练 相邻数对(暴力)
    Java实现 蓝桥杯 算法训练 相邻数对(暴力)
    Java实现 蓝桥杯 算法训练 Cowboys
    Java实现 蓝桥杯 算法训练 Cowboys
    55. Jump Game
    54. Spiral Matrix
    50. Pow(x, n)
  • 原文地址:https://www.cnblogs.com/huligong1234/p/12489766.html
Copyright © 2020-2023  润新知