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