zoukankan      html  css  js  c++  java
  • mongodb(2)

    通过配置项启动数据库

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

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

    为什么要这么做?

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

    mongo.conf

    dbpath=F:mongodata
    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)

  • 相关阅读:
    GitHub设置添加SSH
    Django之Cookie、Session、CSRF、Admin
    Django之强大的Form功能
    Django之Model
    前端:DOM
    前端:JavaScript
    前端:CSS的知识点拾遗
    前端:CSS
    前端:HTML
    Python:线程、进程和协程
  • 原文地址:https://www.cnblogs.com/qiaozhuangshi/p/11674919.html
Copyright © 2011-2022 走看看