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'}]})

Robo连接mongo

注: 创建数据库时,注意当前所在的数据库,创建的用户只属于当前数据库

比如当前是在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)

猜你喜欢

转载自www.cnblogs.com/qiaozhuangshi/p/11674919.html