mongoDB常用命令

1. mongoDB常用命令

目录

1.1. DB相关

1.1.1. 启动

su - mongo
mongod -f /etc/mongodb/mongodb27017.conf

1.1.2. 登录:

mongo admin -uroot -p --port=27017

1.1.3. 关闭mongodb

mongod -shutdown -dbpath=/mongodata/db

1.1.4. 删除数据库:

use dbname;
db.dropDatabase();

1.1.5. 删除集合

use dbname;
db.collectionname.drop()

1.1.6. 连接测试:

/mongodb3.6.17/bin/mongo ip:27017 -uuser -p --authenticationDatabase=admin

1.1.7. 取任意10条数据

db.oplog.rs.find().limit(10).pretty(); 

1.2. 用户权限相关

1.2.1. 通过创建一个用户,赋予用户root权限

use admin;
db.createUser(
	{
		user:"root",
		pwd:"123456",
		roles:[{role:"root",db:"admin"}]
	}
);

附:添加用户时各个角色对应权限

  • 1.数据库用户角色:read、readWrite;
  • 2.数据库管理角色:dbAdmin、dbOwner、userAdmin;
  • 3.集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
  • 4.备份恢复角色:backup、restore
  • 5.所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
  • 6.超级用户角色:root

1.2.2. 添加管理用户:

use admin
db.createUser( {user: "admin",pwd: "123456",roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]})

db.createUser({user:"root",pwd:"root123!@#",roles:[{role:"root",db:"admin"},{role:"readWrite",db:"admin"},{role:"clusterAdmin",db:"admin"},{role:"clusterManager",db:"admin"},{ role: "userAdminAnyDatabase", db: "admin" }]});

1.2.3. 新增普通用户权限:

use admin;
db.createUser({user:"migu",pwd:"Migu#321$!",roles:[{role:"readAnyDatabase",db:"admin"}]});
readAnyDatabase访问所有数据库的只读权限

登录测试,指定认证库
mongo logReportDB -udata_sec -p  --port 9955 --authenticationDatabase=admin 

1.2.4. 给指定数据库新增业务账号:

use admin;
db.createUser({user:"dispersion",pwd:"mgclmh#dispersion2021",roles:[{role:"readWrite",db:"dispersion_prod"}]});

1.2.5. 指定认证方式

use admin;
db.createUser({user:"data_sec",pwd:"d#IuM3_7S9t",roles:[{role:"readAnyDatabase",db:"admin"}],mechanisms : ["SCRAM-SHA-1"]});

1.2.6. 查询所有库下的用户:

use admin
db.system.users.find().pretty();
db.system.users.find({user:"zty_libo"}).pretty();

简洁显示:
db.system.users.find({},{"_id":1});



1.2.7. 主节点上查询admin 库下的用户:

use admin;
db.getUsers();

1.2.8. 授权:

db.grantRolesToUser( "ticket" , [ { role: "dbOwner", db: "pc_ticket" },{ role: "dbOwner", db: "pc_payment" } ]) ;

给用户一个readAnyDatabase权限
db.grantRolesToUser( "zty_libo" , [ { role: "readAnyDatabase", db: "admin" }]) ;

1.2.9. 回收权限:

db.revokeRolesFromUser( "migu", [{role:"clusterMonitor",db:"admin"}] );

1.2.10. 删除用户

删除用户dbabd_user

> use admin
> db.dropUser("dbabd_user")

或者

> use admin
> db.runCommand({ dropUser: "user02" })

1.2.11. 7.修改密码

use admin;
db.changeUserPassword('root','root123!@#');

4.2.10版本:

db.updateUser(
   "root1",
   {
      pwd: "Z3Lvl!EDmp1",
	  mechanisms:["SCRAM-SHA-1"]
   }
);

1.3. 添加白名单

  • clientSource 就是针对客户端的IP 做白名单控制
  • serverAddress 就是针对客户端的IP 做白名单控制

1.3.1. 创建一个用户并添加白名单

use admin;	  
db.createUser(
   {
     user: "test1",
     pwd: "test1",
     roles: [ { role: "readWrite", db: "admin" } ],
     authenticationRestrictions: [ {
        clientSource: ["192.0.2.0"],
        serverAddress: ["198.51.100.0"]
     } ]
   }
)

1.3.2. 对于已经创建的用户添加白名单

db.updateUser(
   "test2",
   {
     authenticationRestrictions: [ {
        clientSource: ["192.0.2.0"],
        serverAddress: ["198.51.100.0"]
     } ]
	}
);

1.4. 监控

1.4.1. 启动监控:

db.enableFreeMonitoring()

1.4.2. 关闭监控:

db.enableFreeMonitoring()

监控地址:
https://cloud.mongodb.com/freemonitoring/cluster/P537HTQMMIBTUFNQUHTKVLMJWY67YYXY

1.5. 索引

基本语法:
db.collection.createIndex(keys, options)

1.5.1. 1、查看集合索引

db.col.getIndexes()

#查看Playlist集合上的索引
db.Playlist.getIndexes()

删除集合

use admin
db.aggregate( [
{$currentOp : { allUsers: true ,idleConnections:false} },
{$project:{opid:1,client:1,op:1,ns:1,microsecs_running:1,command:1}},
{$match:{client:{$exists:true}}},
{$sort:{microsecs_running:-1}}
]).pretty();

db.killOp(13141) 

use goldkinn_gateway_log_dev;
db.GlobalGatewayLog.remove({})

db.GlobalGatewayLog.find().count();

1.5.2. 2、查看集合索引大小

db.col.totalIndexSize()

1.5.3. 3、删除集合所有索引

db.col.dropIndexes()

1.5.4. 4、删除集合指定索引

db.col.dropIndex("索引名称")

1.5.5. 5、创建单独索引:

db.col.createIndex({"title":1})

1.5.6. 6、创建组合索引:

db.col.createIndex({"title":1,"description":-1})

1.5.7. 实例:

db.friend.createIndex({"unique":1});
db.friend.createIndex({"from":1});
db.friend.createIndex({"to":1});

1.5.8. 查看数据行数:

db.FileExchangeTask.count()

1.5.9. 查看数据文件大小:

db.getCollection("FileExchangeTask").totalSize()

1.5.10. 获取MongoDB中collection

db.collection.dataSize()
//collection中的数据大小
db.collection.storageSize()
//为collection分配的空间大小,包括未使用的空间
db.collection.totalIndexSize()
collection中索引数据大小
db.collection.totalSize()
collection中索引+data所占空间

1.6. 副本集合分片集群相关

1.6.1. 查看oplog配置的大小

---从3.6开始,可以使用 replSetResizeOplog命令修改oplog大小(主备都需要修改,建议先修改备库,修改之后写入配置文件)

  1. 查看
use local
db.oplog.rs.stats().maxSize
或者
rs.printReplicationInfo();
  1. 修改oplog大小(单位M),修改前检查磁盘空间剩余量
use admin;
db.adminCommand({replSetResizeOplog:1, size: 10240});

10240 表示10G
该值的范围990M-1T

  1. 修改之后修改配置文件
## for rep
replication:
   oplogSizeMB: 10240

1.6.1.1. 备节点查询之前需要先执行:

rs.slaveOk(); 

1.6.2. 修改复制集密码:

修改复制集的密码需要重新添加复制集节点,修改密码直接在主节点修改即可

1.6.2.1. 移除仲裁节点

rs.remove("localhost:27000")
rs.status

1.6.2.2. 修改密码

use admin;
db.changeUserPassword('root','root123!@#');

1.6.2.3. 添加仲裁节点:

rs.addArb("192.169.100.160:27018")
rs.status

1.6.2.4. 查看延迟:

rs.printSlaveReplicationInfo();

rs.status();
rs.printReplicationInfo();
rs.printSlaveReplicationInfo()

1.6.2.5. 查看分片集群的复制集的配置:

rs.config();
sh.status();

1.6.2.6. 查看复制集状态

rs.status();

1.6.2.7. 主库查看 oplog 日志剩余可使用时间:

rs.printReplicationInfo();

1.6.2.8. 日志和慢日志分析

cat log |grep ERROR

mloginfo mongodb.log --queries --sort count
cat mongodb.log|grep error

grep op_msg
grep op_query

oplog.rs  的慢日志不管

1.6.2.9. 查看表的碎片:

碎片处理:
compass处理

1.6.2.10. 查看数据库负载(mongostat)

mongostat -uroot --authenticationDatabase=admin --port=27017

1.6.3. 设置隐藏节点

1.6.4. MongoDB 副本集主从切换方法

1.6.4.1. 一、方法一rs.setpDown()

将Primary节点降级为Secondary节点

myapp:PRIMARY> rs.stepDown()

这个命令会让primary降级为Secondary节点,并维持60s,如果这段时间内没有新的primary被选举出来,这个节点可以要求重新进行选举。

也可手动指定时间

myapp:PRIMARY> rs.stepDown(30)

在执行完该命令后,原Secondary node3:27017升级为Primary。

操作后再次rs.status();检查状态。

1.6.5. 7、后台创建索引

(建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引)

db.values.createIndex({open: 1, close: 1}, {background: true})

1.6.6. 8、后台创建唯一索引:

db.values.createIndex({open: 1, close: 1}, {background: true,unique: true})

1.7. 分片集群相关命令

列出分片列表

use admin
db.runCommand( { listShards : 1 } )
#查看集群细节
使用 db.printShardingStatus() 或者 sh.status() 查看集群细节,两个命令是等价的.

sh.status()

1.8. pmm相关

1.8.1. 一般用户创建到admin 下面:

use admin; (认证库)
db.getSiblingDB("admin").createUser({
    user: "pmm",
    pwd: "s3cR#tpa$$worD",
    roles: [
        { role: "clusterMonitor", db: "admin" },
        { role: "read", db: "local" }
    ]
});

1.9. 导入导出

1.9.1. 导出csv文件(mongoexport)

mongoexport -h 10.25.149.83 --port 27017 -uroot -p'xxxxxx' --authenticationDatabase admin --db db_name -c Dynamic --out data.csv -q '{"status":"1","type":"2"}'  -f "_id ","textDynamicInfo.content"

1.9.2. 导出json文件

mongoexport --authenticationDatabase=admin -uroot  -d AKTM -c Dynamic --fields=_id,textDynamicInfo.content --query='{status:1,type:2}' -o dynamic.json --type=json

参数说明:

./mongoexport -h 源主机 --port 端口 -u 用户 -p 密码 --authenticationDatabase 认证数据库  -d 备份源数据库 -c 备份源集合 -o 备份输出文件 -q '{"insert_time":ISODate("2018-04-03T12:15:40.647Z")}'

1.9.3. mongodump和mongorestore

mongodump -h 127.0.0.1 --port 27017  -u root -p 'xxxx' --authenticationDatabase admin -d user_prod -o /home/mongodump
mongorestore -h 127.0.0.1 --port 27018 -u root -p 'Migu#34@1B' --authenticationDatabase admin --numParallelCollections=12 -d user_cloud_prod --dir /home/mongodump/user_prod


mongorestore入库非常慢,而且系统中没有锁,I/O资源也正常, 内存足够,但是导入就是非常慢
可以将备机重新初始化

--excludeCollection <collection_name>
--excludeCollectionsWithPrefix <collection_prefix>
重复以排除1个以上
。但是要排除多个集合,您可以重复excludeCollection参数(我认为这就是数组的含义)。示例
您可以添加--collection COLLECTION_NAME以转储所需的集合。默认情况下,如果您未指定要从数据库中转储的集合,则MongoDump将转储该数据库中的所有集合。

从Mongo 3.4开始,现在可以从Mongo数据库转储进行还原时指定--nsExclude 选项,该选项将从还原操作中排除指定的名称空间。当mongodump操作已经发生时,这特别有用。

您可以使用通配符排除多个集合:
mongorestore --db test --nsExclude 'test.*_tmp'
或者,也可以指定多个--nsExclude选项:
mongorestore --db test --nsExclude 'test.collection1' --nsExclude 'test.collection2'

高金:
/opt/mongodb-database-tools-rhel70-x86_64-100.5.2/bin/mongodump -hdds-bp10cacb1a2987441.mongodb.rds.aliyuncs.com --port 3717 -u root -p'xxxxx' --authenticationDatabase admin -d gkdb_center_price -o /home/mongo


/opt/mongodb-database-tools-rhel70-x86_64-100.5.2/bin/mongorestore -hdds-bp10cacb1a2987441.mongodb.rds.aliyuncs.com --port 3717 -u root -p 'xxxx' --authenticationDatabase admin --numParallelCollections=6 -d gkdb_center_price_uat --dir /home/mongo/gkdb_center_price



导出指定集合(表)
/usr/local/mongodb-database-tools-rhel70-x86_64-100.5.2/bin/mongodump -h121.196.58.174 --port 32017 -u root -p'GJsp123abcABC' --authenticationDatabase admin -d gkdb_center_price_test --collection p_price_adjust_item -o /data/mongoDB/mongodb_backup

1.10. 执行计划

1.10.1. explain方式

查看某一个查询的执行计划,

db.FileExchangeTask.find({name:1}).explain()

查看表上(集合上)是否有索引:

db.Audit.getIndexes();

1.10.2. profile

show profile
db.system.profile.find().sort({$natural:-1}).limit(1).pretty();
db.students.find({age:{$lt:10}}).explain();

1.11. 标准 URI 连接语法

mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]

mongodb:// 这是固定的格式,必须要指定。
username:password@ 可选项,如果设置,在连接数据库服务器之后,驱动都会尝试登录这个数据库
host1 必须的指定至少一个host, host1 是这个URI唯一要填写的。它指定了要连接服务器的地址。如果要连接复制集,请指定多个主机地址。
portX 可选的指定端口,如果不填,默认为27017
/database 如果指定username:password@,连接并验证登录指定数据库。若不指定,默认打开 test 数据库。
?options 是连接选项。如果不使用/database,则前面需要加上/。所有连接选项都是键值对name=value,键值对之间通过&或;(分号)隔开

1.12. 时间相关

1.12.1. 时间关键字

 $dayOfYear: 返回该日期是这一年的第几天(全年 366 天)。
 $dayOfMonth: 返回该日期是这一个月的第几天(1到31)。
 $dayOfWeek: 返回的是这个周的星期几(1:星期日,7:星期六)。
 $year: 返回该日期的年份部分。
 $month: 返回该日期的月份部分( 1 到 12)。
 $week: 返回该日期是所在年的第几个星期( 0 到 53)。
 $hour: 返回该日期的小时部分。
 $minute: 返回该日期的分钟部分。
 $second: 返回该日期的秒部分(以0到59之间的数字形式返回日期的第二部分,但可以是60来计算闰秒)。
 $millisecond:返回该日期的毫秒部分( 0 到 999)。
 $dateToString: { $dateToString: { format: , date: } }。

1.12.2. 获取中国标准时间:

var mydate=Date();
输出:
mydate

1.12.3. ObjectId方式

由于 ObjectId 中保存了创建的时间戳,所以你不需要为你的文档保存时间戳字段,你可以通过 getTimestamp 函数来获取文档的创建时间:

> var newObject = ObjectId()
> newObject.getTimestamp()
ISODate("2017-11-25T07:21:10Z")

ObjectId 转为字符串
> newObject.str
5a1919e63df83ce79df8b38f

1.13. 常见的认证方式报错

 db.createUser({user:"data_sec",pwd:"d#IuM3_7S9t",roles:[{role:"readAnyDatabase",db:"admin"}]});
db.system.users.find({user:"data_sec"}).pretty();2021-12-21T14:29:19.060+0800 E QUERY    [thread1] Error: couldn't add user: Use of SCRAM-SHA-256 requires undigested passwords :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DB.prototype.createUser@src/mongo/shell/db.js:1437:15

解决方案:修改mechanisms加密方式为SCRAM-SHA-1

db.createUser({ 
    user: "admin", 
    pwd: "xxx", 
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ], 
    mechanisms : ["SCRAM-SHA-1"] 
})

查用户:

mongo admin -uroot -p'Migu#34@1B' --port=27018 --eval "DBQuery.shellBatchSize = 9999; db.system.users.find().pretty()" >add.txt
cat add.txt | grep user|grep -v "db"|grep -v _id|grep -v role|grep -v UUID|awk -F : '{print $2}'|awk -F \" '{print $2}'
rm add.txt
posted @ 2025-06-30 14:42  数据库小白(专注)  阅读(78)  评论(0)    收藏  举报