美文网首页
MongoDB基础知识

MongoDB基础知识

作者: FangHao | 来源:发表于2017-02-19 23:01 被阅读0次

    安装mongodb

    sudo apt-get install -y mongodb-org
    

    创建mongodb文件目录

    $ sudo mkdir -p /data/db    #创建数据存储目录
    $ sudo chmod mongodb:mongodb /data/* 
    

    启动、停止、重启

    $ sudo service mongodb start
    $ sudo service mongodb stop
    $ sudo service mongodb restart
    

    进入mongoDB客户端

    $ sudo mongo
    

    建议使用robomongo

    数据库操作

    查看当前数据库名称

    db
    

    列出所有在物理上存在的数据库

    show dbs
    

    切换数据库
    如果数据库不存在,则指向数据库,但不创建,直到插入数据或创建集合时数据库才被创建

    use Database_Name
    

    删除数据库

    drop Database_Name
    

    集合collections

    创建集合

    db.createCollection(name, options)
    
    • options参数代表长度限制,如果想做限制可以:
    db.createCollection("sub", { capped : true, size : 10 } )
    

    查看目前存在的集合

    show collections
    

    删除集合

    db.Collection_Name.drop()
    

    数据维护

    插入

    db.collections_name.insert({name:'张三',gender:true})
    
    s1={_id:'20160101',name:'hr'}
    s1.gender=0
    db.stu.insert(s1)
    

    更新

    db.collection_name.update(
       <query>,
       <update>,
       {multi: <boolean>}
    )
    
    • <query>要修改的值,这里写一个查询
    • <update>修改为什么值
    • 默认只修改一条,如果多条修改的话需要第三个参数{multi:true}
    db.stu.uppdate({name:'张三'},{age:18}) #这条修改会改变文档的格式
    db.stu.uppdate({name:'张三'},{$set:{age:18}}) #这条修改只会改变文档中age的值
    

    删除

    db.stu.remove({gender:0},{justOne:true}) #只删除一条匹配的数据
    db.stu.remove({}) #删除stu集合中所有数据
    

    数据查询

    db.stu.find({name:'张三'}) #基础查询
    db.stu.find().pretty() #格式化查询
    db.stu.findOne({name:'张三'}) #查询符合条件的一条数据
    

    比较运算符

    • 等于,默认是等于判断,没有运算符
    • 小于$lt
    • 小于或等于$lte
    • 大于$gt
    • 大于或等于$gte
    • 不等于$ne
    db.stu.find({age:{$gte:18}})
    

    逻辑运算符

    • 查询时可以有多个条件,多个条件之间需要通过逻辑运算符连接
    • 逻辑与:默认是逻辑与的关系
    db.stu.find({age:{$gte:18}},{title:'python'})
    
    • 逻辑或:使用$or
    db.stu.find({age:{$gte:18}},$or:[{title:'python'},{sal:{$lte:1500}}])
    

    范围运算符

    • 使用"$in","$nin" 判断是否在某个范围内
    db.stu.find(name:{$in:['张三','李四','王五']})
    

    支持正则表达式

    • 使用//或$regex编写正则表达式
    db.stu.find({name:{$regex:'^王'}})
    db.stu.find({name:/^王/})
    

    自定义查询

    • 使用$where后面写一个函数,返回满足条件的数据
    db.stu.find({$where:function(){return this.age>20}})
    

    LIMIT与SKIP

    db.stu.find().limit(2)
    db.stu.find().skip(2)
    db.stu.find().skip(2).limit(2) #建议先skip再limit
    

    投影

    • 在查询到的返回结果中,只选择必要的字段,而不是选择一个文档的整个字段
    db.stu.find({},{name:1,gender:1}) #查询结果会有的字段是_id、name、gender
    db.stu.find({},{_id:0,name:1,gender:1}) #查询结果不会存在_id
    

    排序

    • 方法sort(),用于对结果集进行排序
    db.stu.find().sort({gender:-1,age:1})
    

    统计个数

    • 方法count()用于统计结果集中文档条数
    db.stu.find({title:'python'}).count()
    db.stu.count({title:'python'})
    

    消除重复

    • 方法distinct()对数据进行去重
    db.集合名称.distinct('去重字段',{条件})
    db.stu.distinct('name',{age:{$gte:20}})
    

    聚合 aggregate

    • 语法
    db.集合名称.aggregate([{管道:{表达式}}])
    
    • 常用管道
      • $group:将集合中的文档分组,可用于统计结果
      • $match:过滤数据,只输出符合条件的文档
      • $project:修改输入文档的结构,如重命名、增加、删除字段、创建计算结果
      • $sort:将输入文档排序后输出
      • $limit:限制聚合管道返回的文档数
      • $skip:跳过指定数量的文档,并返回余下的文档
      • $unwind:将数组类型的字段进行拆分
    • 常用表达式
      • $sum:计算总和,$sum:1同count表示计数
      • $avg:计算平均值
      • $min:获取最小值
      • $max:获取最大值
      • $push:在结果文档中插入值到一个数组中
      • $first:根据资源文档的排序获取第一个文档数据
      • $last:根据资源文档的排序获取最后一个文档数据
    db.stu.aggregate([
    {$match:{age:{$gt:20}}},
    {$group:{_id:'$title',maxAge:{$max:'$age'}}},
    {$sort:{maxAge:-1}},
    {$skip:2},
    {$limit:1}
    ])
    
    db.stu.aggregate([
        {$project:{_id:0,name:1,age:1}}
    ])
    
    db.集合名称.aggregate([{$unwind:'$字段名称'}])
    db.t2.aggregate([{$unwind:'$size'}])
    db.t3.aggregate([{$unwind:{path:'$sizes',preserveNullAndEmptyArrays:true}}]) #消除null或者空数组的影响
    

    索引

    创建索引

    • 1表示升序,-1表示降序
    db.集合.ensureIndex({属性:1})
    如
    db.stu.ensureIndex({'name':1})
    db.stu.ensureIndex({'name':1},{'uniqe':true}) #创建唯一索引
    db.stu.ensureIndex({'name':1,'age':-1}) #创建多行索引
    

    查看所有索引

    db.stu.getIndexes()
    

    删除索引

    db.stu.dropIndexes('索引名') #索引名从db.stu.getIndexes()中查询
    

    安全性

    • 常用系统角色如下:
    • root:只在admin数据库中可用,超级账号,超级权限
    • Read:允许用户读取指定数据库
    • readWrite:允许用户读写指定数据库

    mongo登录客户端创建超级管理员用户

    use admin
    db.createUser({
    user:'admin',
    pwd:'admin',
    roles:[{role:'root',db:'admin'}]
    })
    

    修改配置文件启动身份验证

    sudo vi /etc/mongod.conf
    
    security:
      authorization: enabled #注意enabled前有空格
    

    重启mongd服务

    sudo service mongod restart
    

    退出后重新登录

    mongo -u admin -p --authenticationDatabase admin
    

    使用超级用户创建普通用户

    use runoob #要给哪个数据库创建用户就use哪个
    db.createUser({
    user:'runoob',
    pwd:'runoob',
    roles:[{role:'readWrite',db:'runoob'}]
    })
    

    退出后使用普通用户登录

    mogo -u runoob -p --authenticationDatabase runoob
    

    修改用户:可以修改pwd、roles属性(只能用admin用户修改)

    db.updateUser('runoob',{pwd:'123'})
    

    副本集

    创建数据存储路径

    cd ~/Desktop
    mkdir t1
    mkdir t2
    

    启动主从服务

    mongod --bind_ip 192.168.100.128 --port 27017 --dbpath ~/Desktop/t1 --replSet rs0
    mongod --bind_ip 192.168.100.128 --port 27018 --dbpath ~/Desktop/t2 --replSet rs0
    

    也可以通过配置文件修改启动服务vim /etc/mongod.conf

    #主服务配置
    port=27018 #指定端口
    fork=true #后台运行
    dbpath=/home/map/mongodb/mongo #规定数据库的位置
    logpath=/home/map/mongodb/mlog/mongodb.log #规定数据库的日志文件
    master=true #设置主
    # bind_ip=127.0.0.1,192.168.0.4 #允许的地址 为了安全
    nohttpinterface=true #禁止http访问
    #从服务配置
    port=27018 #指定端口
    fork=true #后台运行
    dbpath=/home/map/mongodb/mongo #规定数据库的位置
    logpath=/home/map/mongodb/mlog/mongodb.log #规定数据库的日志文件
    slave=true #声明从
    source=192.168.0.4:27018 #规定从属于哪个ip  注意:ip是主服务器的  最好用内网ip
    # bind_ip=127.0.0.1,192.168.0.4 #允许的地址 为了安全
    nohttpinterface=true #禁止http访问
    $ sudo mongod -f  ./mongod.conf #分别启动主从服务器
    

    连接主服务

    mongo --host 192.168.196.128 --port 27017
    

    主服务初始化并查看状态

    rs.initiate()
    rs.status()
    

    主服务添加从服务集

    rs.add('192.168.196.128:27018')
    

    启动从服务

    mongo --host 192.168.196.128 --port 27018
    

    向主服务器中插入数据

    use test1
    for(i=0;i<10;i++){db.t1.insert({_id:i})}
    db.t1.find()
    

    在从服务器中插查询

    rs.slaveOk()
    db.t1.find()
    

    删除从服务

    rs.remove('192.168.196.128:27018')
    

    备份与恢复

    备份

    sudo mkdir test1bak
    sudo mongodump -h 192.168.196.128:27017 -d test1 -o ~/Desktop/test1bak
    #不需要安全认证
    sudo mongodump -u runoob -p runoob --authenticationDatabase runoob -h 192.168.100.128:27017 -d runoob -o ~/Desktop/back #需要安全认证
    

    恢复

    sudo mongorestore -h 192.168.100.128:27107 -d runoob1 -o ~/Desktop/back #不需要安全认证
    sudo mongorestore -u admin -p admin --authenticationDatabase admin -h 192.168.100.128:27017 -d runoob1 -o ~/Desktop/back #需要安全认证
    

    相关文章

      网友评论

          本文标题:MongoDB基础知识

          本文链接:https://www.haomeiwen.com/subject/bstswttx.html