技术文章 > 数据库 > mongoDB常用指令 

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();


来源:本站 行痴 亲测原创,2023-08-21