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

原文地址:https://www.cnblogs.com/huligong1234/p/12489766.html