目录
通过配置项启动数据库
导入导出数据
备份与恢复
锁定和解锁数据库
用户管理
数据库高级命令
什么是固定集合
gridfs
参考
通过配置项启动数据库
参数 | 含义 |
---|---|
-dbpath | 指定数据库文件的目录 |
--port | 端口 默认是 27017 28017 |
--fork | 以后台守护的方式进行启动 |
--logpath | 指定日志文件输出路径 |
--config | 指定一个配置文件 |
--auth | 以安全方式启动数据库,默认不验证 |
首先要建立一个 mongo.conf 文件, 通过文件来启动 MongoDB 服务器
为什么要这么做?
把常用配置写在一个文件里, 这样不用每次都自己输入参数, 提高易维护性
- mongo.conf
- dbpath=F:\mongo\data
- logpath=F:\mongo
- port=50001
注意 data 目录要提前创建好
启动服务器
mongod --config mongo.conf
停止数据库
bin/mongod -shutdown -config data/MongoDB.conf
启动客户端
mongo --port 50001
导入导出数据
这命令是保存了文件格式
mongoimport 导入数据
mongoexport 导出数据
参数 | 含义 |
---|---|
-h [ --host ] | 连接的数据库 |
--port | 端口号 |
-u | 用户名 |
-p | 密码 |
-d | 导出的数据库 |
-d | 导出的数据库 |
-c | 指定导出的集合 |
-o | 导出的文件存储路径 |
-q | 进行过滤 |
准本数据
- use c1;
- var data = [];
- for (var i = 0; i <10; i++) {
- data.push({name:"mx"+i, index:i})
- }
- db.c1.insert(data)
- db.c1.find();
备份记录
./mongoexport -h 127.0.0.1 --port 27017 -d c1 -c c1 -o c1.bak
需要在服务器上操作
删除记录
- db.c1.remove({
- })
- db.c1.find()
导入 j 记录, 这时候再把数据导入进来
./mongoimport -h 127.0.0.1 --port 27017 -d c1 -c c1 --file c1.bak
备份与恢复
备份和上面的导出数据有什么区别 ?
上面导出数据只能导出 jjson 格式的, 但有时候我们的 MongoDB 会存二进制的数据, 这个时候 JSON 不支持这种数据格式, 所以需要我们接下来的这种方式导出数据.
mongodump
在 MongoDB 中我们使用 mongodump 命令来备份 MongoDB 数据. 该命令可以导出所有数据到指定目录中.
mongodump -h dbhost -d hostname -o dbdirectory
- | - |
---|---|
-h | MongDB 所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017 |
-d | 需要备份的数据库实例,例如:test |
-o | 备份的数据存放位置 |
- ./mongdump -h 127.0.0.1:27017 -d c1 -o c1.dump
- mongorestore
MongoDB 使用 mongorestore 命令来恢复备份的数据
-h MongoDB 所在服务器地址
-d 需要恢复的数据库实例
最后的一个参数, 设置备份数据所在位置 mongorestore data.dmp
./mongorestore -h 127.0.0.1:27017 -d c1 c1.dmp/c1
锁定和解锁数据库
为了数据的完整性和一致性, 导出前要先锁定写入, 导出后再解锁.
- > use admin
- > db.runCommand({fsync:1,lock:1})
- {
- "info" : "now locked against writes, use db.fsyncUnlock() to unlock",
- "seeAlso" : "http://dochub.mongodb.org/core/fsynccommand",
- "ok" : 1
- }
- > db.fsyncUnlock();
- { "ok" : 1, "info" : "unlock completed" }
首先会把缓冲区的数据暴力输入磁盘, 然后给数据库一个写入锁, 其它实例的写入操作全部被阻塞, 直到 fsync+lock 释放锁为止.
用户管理
查看角色
show roles
内置角色
- | - |
---|---|
数据库用户角色 | read、readWrite |
数据库管理角色 | dbAdmin、dbOwner、userAdmin |
集群管理角色 | clusterAdmin、clusterManager、clusterMonitor、hostManage |
所有数据库角色 | readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase |
超级用户角色 | root |
内部角色 | __system |
创建用户
- // 进入 admin 库, 创建用户管理角色
- use admin
- db.createUser({
- user:'useradmin',pwd:'123456',roles:[{
- role:'userAdminAnyDatabase'
- }]
- })
- // 给具体的数据库创建用户角色等
- db.createUser({
- user:'c1',pwd:'123456',roles:[{
- role:'dbAdmin',db:'c1'
- }]
- })
注: 创建数据库时, 注意当前所在的数据库, 创建的用户只属于当前数据库
比如当前是在 admin 数据库下, 那么创建的用户只属于 admin, 使用三方工具或者程序连接的时候要注意数据库与用户对应
查看用户的权限
db.runCommand({usersInfo:'mx',showPrivileges:true})
服务器启动权限认证
- ./mongod --dbpath=/usr/local/software/MongoDB/data/db
- ./mongod --config mongo.conf --dbpath=/usr/local/software/MongoDB/data/db
用户登陆和修改密码
- use admin
- db.auth('mx','123456')
- db.changeUserPassword('mx2', '123')
- db.auth('mx2','123')
- # 登陆的时候指定用户名密码和数据库
- ./mongo -u 'useradmin' -p '123456' --authenticationDatabase "c1"
注: 用户属于哪个数据库就在哪个数据库下验证
使用 robomongo 怎么连接 MongoDB 报错 network is unreachable
1, 删除用户: db.dropUser("admin");
2, 修改 version:db.system.version.update({ "_id" : "authSchema"},{$set: {"currentVersion" : 3} }) ; // 我这里需要改为 5
3, 重新创建用户(在 admin 数据库下创建的能看到所有的库):
- use admin
- db.createUser({
- user:"qiao",pwd:"123456",roles:[{
- "role":"userAdminAnyDatabase","db":"admin"
- },{
- "role":"readWrite","db":"test"
- }]
- })
4, 重启 mongdb 服务, 再次测试,
数据库高级命令
准备数据
- var c1 = [
- {provience:'北京',home:'北京',age:1},
- {provience:'北京',home:'北京',age:2},
- {provience:'北京',home:'北京',age:3},
- {provience:'广东',home:'广州',age:1},
- {provience:'广东',home:'佛山',age:2},
- {provience:'广东',home:'东莞',age:3}
- ]
- db.c1.insert(c1);
- count
查看记录数
- db.c1.find().count()
- distinct
根据 name 查找 c1 数据库中的不重复的集合
- db.runCommand({
- distinct:'c1', key:'home'
- }).values
- gruop
分组
- db.runCommand({
- ? group: {
? ns : 集合名称,
? key : 分组的键,
? inital : 初始值,
? $reduce : 分解器,
? query : 条件,
? finalize : 完成时的处理器
? }
})
按城市分组
- db.runCommand({
- group: {
- ns: 'c1',
- key: { provience:1 },
- query: {age:{$gt:1}},
- initial: {total: 0},
- $reduce:function(doc, initial){
- initial.total += doc.age
- }
- }
- })
结果:
- provience{
- "retval" : [
- {
- "provience" : "北京",
- "total" : 5.0
- },
- {
- "provience" : "广东",
- "total" : 5.0
- }
- ],
- "count" : NumberLong(4),
- "keys" : NumberLong(2),
- "ok" : 1.0
- }
删除集合
db.runCommand({drop:'c1'})
runCommand 常用命令
db.runCommand({buildInfo:1})
可以看到系统的相关信息
什么是固定集合
MongoDB 固定集合 (Capped Collections) 是性能出色且有着固定大小的集合, 对于大小固定, 我们可以想象其就像一个环形队列, 当集合空间用完后, 再插入的元素就会覆盖最初始的头部的元素!
特性
没有索引
插入和查询速度非常快 不需要重新分配空间
特别适合存储日志
创建固定集合
我们通过 createCollection 来创建一个固定集合, 且 capped 选项设置为 true
还可以指定文档个数, 加上 max:100 属性
判断 j 集合是否为固定集合: db.logs.isCapped()
size 是整个集合空间大小, 单位为[kb]
max 是集合文档个数上限, 单位是[个]
如果空间大小到达上限, 则插入下一个文档时, 会覆盖第一个文档; 如果文档个数达到上限, 同样如果插入下一个文档, 会覆盖第一个文档. 两个参数上限判断取的是[与] 逻辑
capped 封顶的
db.createCollection('logs', {size:50, max:5, capped:true})
非固定结合转为固定结合
- db.runCommand({
- convertToCapped:'logs', size:5
- })
- gridfs
gridfs 是 MongoDB 自带的文件系统, 使用二进制存储文件
mondodbk 可以 以 BSON 格式保存二进制对象
但是 BSON 对象的体积不能超过 4M, 所以 MongoDB 提供了 mongofiles. 它可以把一个大文件透明地分割成小文件(256k), 从而保存大体积的数据
GridFS 用于存储和恢复那些超过 16M 的 (BSON 文件限制) 的文件(如: 图片, 音频, 视频等).
GridFS 用两个集合来存储一个文件: fs.files 与 fs.chunks
每个文件的实际内容被存在 chunks(二进制数据)中, 和文件有关的 meta 数据 (filename,content_type, 还有用户自定义的属性) 将会被存在于 files 集合中
上传一个文件
- | - |
---|---|
-d | 数据库的名称 |
-l | 源文件的位置 |
put | 指定文件名 |
mongofiles -d myfiles put test.txt
获取并下载文件
mongofiles -d myfiles get 'test.txt'
查看所有文件
- // 执行文件查询
- ./mongofiles -d myfiles list
- // 服务端查询
- > db.fs.files.find()
- > db.fs.chunks.find()
删除文件
mongfiles -d myfiles delete "test.txt"
参考
MongoDB 速成(2) https://juejin.im/post/5cad9cefe51d456e336cd461
来源: http://www.bubuko.com/infodetail-3240808.html