今天看啥  ›  专栏  ›  lio-mengxiang

mongodb想速成吗,这个系列教程你可以看看(2)

lio-mengxiang  · 掘金  ·  · 2019-04-12 07:10
阅读 22

mongodb想速成吗,这个系列教程你可以看看(2)

这个mongodb速成文章第二篇,第一篇最基础的请看下面链接(希望给个赞哦,比心^^)

mongodb想速成吗,这个系列教程你可以看看(1)

1、通过配置项启动数据库

参数 含义
-dbpath 指定数据库文件的目录
--port 端口 默认是27017 28017
--fork 以后台守护的方式进行启动
--logpath 指定日志文件输出路径
--config 指定一个配置文件
--auth 以安全方式启动数据库,默认不验证

首先需要建立一个mongo.conf文件,通过文件来启动mongodb服务器

1.1 为什么要这么做

把常用配置写在一个文件里,这样不用每次都自己输入参数,提高易维护性

1.2 mongo.conf

dbpath=F:\mongo\data
logpath=F:\mongo
port=50001
复制代码

注意data目录要提前创建好

1.3 启动服务器

mongod --config mongo.conf
复制代码

1.4 启动客户端

mongo --port 50001
复制代码

2、 导入导出数据

这命令是保存成了文件格式

  • mongoimport 导出数据
  • mongoexport 导入数据
参数 含义
-h [ --host ] 连接的数据库
--port 端口号
-u 用户名
-p 密码
-d 导出的数据库
-d 导出的数据库
-c 指定导出的集合
-o 导出的文件存储路径
-q 进行过滤

2.1 准备数据

use c1;
var data =[
 {name: "mx0", index: 0},
 {name: "mx1", index: 1},
 {name: "mx2", index: 2},
 {name: "mx3", index: 3},
 {name: "mx4", index: 4},
 {name: "mx5", index: 5},
 {name: "mx6", index: 6},
 {name: "mx7", index: 7},
 {name: "mx8", index: 8},
 {name: "mx9", index: 9}
];
db.c1.insert(data);
db.c1.find();
复制代码

2.2 备份记录

mongoexport -h 127.0.0.1 --port 50001  -d c1 -c c1 -o c1.bak
复制代码

2.3 删除记录

db.c1.remove({});
db.c1.find()
复制代码

2.4 导入记录 这时候再把数据导入进来

mongoimport -h 127.0.0.1 --port 50001 -d c1 -c c1 --file c1.bak
复制代码

3、 备份与恢复

3.1 备份和上面的导出数据有什么区别

上面导出数据只能导出json格式的,但有时候我们的mongodb会存2进制的数据,这个时候json不支持这种数据类型,所以需要我们接下来的这种方式来导出数据。

3.1 mongodump

在Mongodb中我们使用mongodump命令来备份MongoDB数据。该命令可以导出所有数据到指定目录中。

mongodump -h dbhost -d dbname -o dbdirectory
复制代码
- -
-h MongDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017
-d 需要备份的数据库实例,例如:test
-o 备份的数据存放位置
mongodump -h 127.0.0.1:50001 -d c1 -o c1.dmp
复制代码

3.2 mongorestore mongodb使用 mongorestore 命令来恢复备份的数据。

--host MongoDB所在服务器地址 --db -d 需要恢复的数据库实例 最后的一个参数,设置备份数据所在位置 mongorestore data.dmp

mongorestore -h 127.0.0.1:50001 -d c2 c1.dmp/c1
复制代码

5、 锁定和解锁数据库

为了数据的完整性和一致性,导出前要先锁定写入,导出后再解锁。

> use admin;
switched to db 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释放锁为止

6. 用户管理

6.1 查看角色

show roles;
复制代码

内置角色

- -
数据库用户角色 read、readWrite
数据库管理角色 dbAdmin、dbOwner、userAdmin
集群管理角色 clusterAdmin、clusterManager、clusterMonitor、hostManage
所有数据库角色 readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
超级用户角色 root
内部角色 __system

6.2 创建用户的方法

use admin;
db.createUser({user:'mx',pwd:'123456',roles:[{role:'read',db:'c1'}]});
复制代码

6.3 查看用户的权限

db.runCommand({usersInfo:'mx',showPrivileges:true});
复制代码

6.4 服务器启动权限认证

mongod --dbpath=F:\data --auth
复制代码

6.5 用户登录和修改密码

use admin;
db.auth('mx','123456')

db.changeUserPassword('mx2','123');
db.auth('mx2','123')
复制代码

7. 数据库高级命令

7.1 准备数据

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);
复制代码

7.2 count

查看记录数

db.c1.find().count();
复制代码

7.3 查找不重复的值

distinct

db.runCommand({distinct:'c1',key:'home'}).values;
// [ "北京", "广东" ]
复制代码

7.3 group 分组

db.runCommand({
        group:{
                ns:集合名称,
                key:分组的键,
                initial:初始值,
                $reduce:分解器
                query:条件,
                finalize:完成时的处理器
        }
});
复制代码

7.3.1 按城市分组

db.runCommand({
	group: {
		ns: 'c1',
		key: { provience:1 },
		query: {age:{$gt:1}},
		initial: {total: 0},
		$reduce:function(doc, initial){
			initial.total+=doc.age
		}
	}
})
复制代码

7.4 删除集合

db.runCommand({drop:'c1'});
复制代码

7.5 runCommand常用命令

db.runCommand({buildInfo:1});
复制代码

可以看见有操作系统信息是windows,架构师x86_64,等等系统的信息

db.runCommand({getLastError:"c1"});
复制代码

8. 什么固定集合

MongoDB 固定集合(Capped Collections)是性能出色且有着固定大小的集合,对于大小固定,我们可以想象其就像一个环形队列,当集合空间用完后,再插入的元素就会覆盖最初始的头部的元素!

8.1 特性

  • 没有索引
  • 插入和查询速度速度非常快 不需要重新分配空间
  • 特别适合存储日志

8.2 创建固定集合

  • 我们通过createCollection来创建一个固定集合,且capped选项设置为true:
  • 还可以指定文档个数,加上max:1000属性:
  • 判断集合是否为固定集合: db.logs.isCapped()
  • size 是整个集合空间大小,单位为【KB】
  • max 是集合文档个数上线,单位是【个】
  • 如果空间大小到达上限,则插入下一个文档时,会覆盖第一个文档;如果文档个数到达上限,同样插入下一个文档时,会覆盖第一个文档。两个参数上限判断取的是【与】的逻辑。
  • capped 封顶的
 db.createCollection('logs',{size:50,max:5,capped:true});
复制代码

8.3 非固定集合转为固定集合

db.runCommand({convertToCapped:"logs",size:5});
复制代码

9. gridfs

  • gridfs是mongodb自带的文件系统,使用二进制存储文件。
  • mongodb可以以BSON格式保存二进制对象。
  • 但是BSON对象的体积不能超过4M。所以mongodb提供了mongofiles。它可以把一个大文件透明地分割成小文件(256K),从而保存大体积的数据。
  • GridFS 用于存储和恢复那些超过16M(BSON文件限制)的文件(如:图片、音频、视频等)。
  • GridFS 用两个集合来存储一个文件:fs.files与fs.chunks。
  • 每个文件的实际内容被存在chunks(二进制数据)中,和文件有关的meta数据(filename,content_type,还有用户自定义的属性)将会被存在files集合中。

9.1 上传一个文件

- -
-d 数据库的名称
-l 源文件的位置
put 指定文件名
// test.txt必须创建在当前目录
mongofiles -d myfiles put test.txt
复制代码

9.2 获取并下载文件

mongofiles -d myfiles  get 'test.txt'
复制代码

9.3 查看所有文件

mongofiles -d myfiles  list
>db.fs.files.find()
>db.fs.chunks.find()
复制代码

9.4 删除文件

mongofiles -d myfiles delete "test.txt"
复制代码



原文地址:访问原文地址
快照地址: 访问文章快照