mongodb(2)
通过配置项启动数据库
参数 | 含义 |
---|---|
-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"