mongoDB常用指令
以下指令,在mongoDB-3.6.22版本下实操使用过:
1. 启动、停止
/data/apps/mongodb-3.6.22/bin/mongod -f /data/mongodb/conf/mongod.conf & #启动服务进程
/data/apps/mongodb-3.6.22/bin/mongod --shutdown -f /data/mongodb/conf/mongod.conf #停止服务进程
2. 连接
mongo -u root -p password --host 10.104.36.252 #默认test库验证
mongo -u root -p password --authenticationDatabase admin --host 10.104.36.252 #admin库验证
直接连接不灵时,先连的是test库,然后切换到admin库校验:
use admin;
db.auth("root","password");
3. 创建用户、库、表单集、索引
//账号管理库
use admin;
db.createUser({ user: 'root', pwd: 'password', roles: ["readWrite", "dbAdminAnyDatabase", "userAdminAnyDatabase"] });
db.createUser({ user: 'user1', pwd: 'password1', roles: ["readWrite", "dbAdmin", "dbOwner"] });
//用户自建库
use mydb;
db.createUser({ user: 'user1', pwd: 'password1', roles: ["readWrite", "dbAdmin", "dbOwner"] });
//表单集
db.createCollection("accounts");
//索引
try { db.getCollection("account").ensureIndex({ "accountName": 1, "operator": 1 }, { background: 1 }) } catch (e) { print(e) }
try { db.getCollection("accounts").ensureIndex({ "lastLoginTime": 1, "isBanToLogin": 1 }, { background: 1 }) } catch (e) { print(e) }
4. 删除库、表单集
db.accounts.drop();//删除表单集
db.dropDatabase();//删除库
5. 记录插入、查询、更新、删除
db.gmAccount.insertOne({
"activity" : 1,
"diamond" : 1,
"gamingMoney" : 1,
"isAdmin" : 1,
"name" : "administrator",
"password" : "password-string",
}); //插入
db.gmAccount.find({"name" : "administrator"},{"diamond" : 1,"gamingMoney" : 1}); //查询
db.gmAccount.update({"name" : "administrator"},{$set:{"diamond" : 1000,"gamingMoney" : 2000}},false,true); //更新
db.gmAccount.remove({"name" : "administrator"}); //删除
6. 分组统计(聚合,aggregate):
例一:
//统计account表中玩家钻石、金币总量
var db = connect("127.0.0.1:27017/gameDB","user","pwd");
var s = db.account.aggregate([
{$group: { _id: null, diamond: { $sum: "$diamond" } , money: { $sum: "$gamingMoney" } } }
]);
例二:
db.consumeStat.findOne();
db.consumeStat玩家消费记录表结构如下:
{
"_id" : ObjectId("57c68a830c34a53c93c424d3"),
"numOfGame" : 544,
"numOfWins" : 531120330,
"numOfLoss" : -498706690,
"dt" : ISODate("2016-08-30T16:00:00Z"),
"id" : "57c280f15bf0996c0d0130e7",
"queryId" : 34542185,
"nickname" : "冰糖",
"family" : 387,
"familyName" : "非诚勿扰"
}
按 玩家 统计 某段日期内 的 玩局、胜局、败局数:
var dFrom = ISODate("2019-04-28T16:00:00Z");
var dTo = ISODate("2019-05-05T16:00:00Z");
printjson("QueryID | NickName | Times | Wins | Loss");
db.consumeStat.aggregate( [
{ $match: { "dt": { $gte: dFrom, $lte: dTo } } } ,
{ $group: { _id: "$queryId", nickname:{ $first: "$nickname" }, times: {$sum: "$numOfGame" }, wins: { $sum: "$numOfWins" } , loss: { $sum: "$numOfLoss" } } }
] ).forEach(
function(c){
printjson(c._id + " | " + c.nickname + " | " + c.times + " | " + c.wins + " | " + c.loss);
}
);
按 家族 统计 某段日期内 的 玩局、胜局、败局数:
var dFrom = ISODate("2019-04-28T16:00:00Z");
var dTo = ISODate("2019-05-05T16:00:00Z");
printjson("FamilyID | FamilyName | Times | Wins | Loss");
db.consumeStat.aggregate( [
{ $match: { "dt": { $gte: dFrom, $lte: dTo } } } ,
{ $group: { _id: "$family", familyName:{ $first: "$familyName" }, times: {$sum: "$numOfGame" }, wins: { $sum: "$numOfWins" } , loss: { $sum: "$numOfLoss" } } }
] ).forEach(
function(c){
printjson(c._id + " | " + c.familyName + " | " + c.times + " | " + c.wins + " | " + c.loss);
}
);
7. 导出、导入表单集
mongoexport -h 127.0.0.1 -u user -p password -d dbname -c collection-name -o path/of/collection-name.json //导出完整表单集
mongoexport -h 127.0.0.1 -u user -p password -d dbname -c collection-name -q '{},{field:value}' -o path/of/collection-name.json //只导出符合条件记录、选择的字段
mongoimport -h 127.0.0.1 -u user -p password -d dbname -c collection-name -o path/of/collection-name.json //追加记录现在表单集
mongoimport -h 127.0.0.1 -u user -p password -d dbname -drop -c collection-name -o path/of/collection-name.json //清除原表单集记录,全部替换为导入的记录
8. 备份、恢复
/data/apps/mongodb-3.6.22/bin/mongodump -u user -p password -d dbname -o /dump/path #整库备份
/data/apps/mongodb-3.6.22/bin/mongorestore -h hostname_or_ip -u user -p password --authenticationDatabase admin -d dbname --drop /dump/path #整库恢复,admin 库验证权限
/data/apps/mongodb-3.6.22/bin/mongodump -u user -p password -d dbname -c collection-name -o /dump/path #备份恢复单个表单集表单集
/data/apps/mongodb-3.6.22/bin/mongorestore -h hostname_or_ip -d dbname -c collection-name -drop /dump/path/collection-name.bson #恢复单个表单集
9. 完整shell脚本:备份并压缩,保留最新一周的数据
//首先删除超过一周的备份压缩文件
find /data/backup -name *.tgz -ctime +7 -delete
//然后备份数据到临时目录下
/data/apps/mongodb-3.6.22/bin/mongodump -u user -p pwd -d dbname -o /data/tmp/dump
//压缩为以日期时间为文件名的文件
current_time=$(date "+%Y%m%d%H%M%S")
cd /data/tmp && tar cvzf dbname-$current_time.tgz dump
//删除临时目录的备份文件
rm -r /data/tmp/dump
//转移压缩文件到另一台备份机,或备份目录
scp /data/tmp/dbname-$current_time.tgz backup_host_nam/data/backup/dbname
rm -f /data/tmp/dbname-$current_time.tgz
10. 访问兄弟库
在某个库中执行时,访问同一数据库服上的另一个库。如在 gameDB 中执行如下脚本,访问 gmDB:
var gmDB = db.getSiblingDB('gmDB');
gmDB.auth('usr', 'pwd');
...
11. 查看、释放存储空间
repairDatabase是官方文档中认为唯一可以回收硬盘空间的方法。
//查看表单集文件大小
db.mytest.stats().storageSize;
//查看的内存占用
db.serverStatus().mem;
//回收硬盘空间
db.repairDatabase();