美文网首页
MongoDB入门

MongoDB入门

作者: 强某某 | 来源:发表于2018-04-21 11:25 被阅读2次

    数据库相关

    数据库安装和配置


    安装之后需要配置环境变量;
    验证:mongo命令是否有效
    启动服务端:

    • C:User\Admintor(任意地址)> mongod --dbpath D:\DevelopSoft\mongolog;
      说明:--dbpath 就是选择数据库文档所在的文件夹,后面还可以附加--port 端口号从而指定启动端口(否则默认是27017)
    • 如果在c盘根目录下新建data/db两级目录,则可以直接使用mongod启动数据库,但是如果这两级目录不存在则报错
    • mongod:是开启数据库,不能关闭,一旦这个cmd关闭,数据库就关闭了
    • 启动客户端:然后另外开启一个cmd,运行mongo连接数据库

    查看


    查看当前数据库名称:db
    查看所有数据库:show dbs
    切换数据库:use 数据库名称 (如果数据库不存在,则指向数据库,但不创建
    直到插入数据或创建集合时数据库才被创建)
    默认数据库为test,如果你没有创建新的数据库,集合将存放在test数据库中
    删除数据库:db.dropDatabase() 删除的时当前数据库


    结构说明


    数据库->集合collection(可以多个)->文档document(可以多个,文档和文档之间没有联系)

    集合相关

    创建集合


    db.createCollection(name,options)
    name时要创建的集合的名称
    options是一个文档,用于指定集合的配置,但是此配置可以没有,就代表无限制


    限制集合大小


    db.createCollection("sub",{capped:true,size:10})
    capped :默认是false表示不设置上限,值true表示设置上限
    size: 当capped值为true时,需要指定此参数,表示上限大小,当文档达到上限
    时,会将之前的数据覆盖,单位为字节

    查看当前数据库的集合

    show collections

    删除

    db.集合名称.drop()


    数据类型


    Object ID:文档id 不需要维护,作为主键
    String:字符串,必须是有效的utf-8
    Boolean:存储一个布尔值 true或false
    Integer:整数可以是32或64位,这取决于服务器
    Double:存储浮点数
    Arrays:数组或列表,多个值存储到一个键
    Object:用于嵌入式的文档,即一个值为一个文档
    Null:存储null值
    Timestamp:时间戳
    Date:存储当前日期或时间的UNIX时间格式


    插入

    • 插入一个文档对象/只能是一个对象
      db.colletion.insertOne()
    • 插入多个文档对象/只能是数组
      db.colletion.insertMany()
    • 插入一个或者多个/数组或者对象
      db.colletion.insert()
    db.集合名称.insert(document)
    插入文档时候,如果不指定_id参数,mongdb会为文档分配一个唯一的objectid
    案例:
    栗子1:db.stu.insert({name:'a',gender:1})
    栗子2:
    s1={_id:'20160101',name:'hr'}
    s1.gender=0
    db.stu.insert(s1)
    # 插入多个(传入的是数组)
    db.hehe.insert([{info:"asa"},{name:"asas"}])
    
    
    
    # 简单查询
    db.集合名称.find()
    - 查询,如果多个则只显示第一个
    db.colletion.findOne({name:"b"})
    - 查询,返回的是数组,所以可以利用[]索引
    db.colletion.find({name:"b"})[0]
    - 还可以在find的结果后面加上,count()/length()等方法
    db.colletion.find({name:"b"}).length()
    
    # 更新
    db.集合名称.update(
        <query>,
        <update>,
        {multi:<boolean>}
    )
    参数query:查询条件,类似sql语句update中的where部分
    参数update:更新操作符,类似sql语句中的set部分
    参数multi:可选,默认是false,表示只更新找到的第一条记录,值为true表示条件满足的全部更新
    - 默认会使用新对象替换旧对象(默认只会替换一个),此时参数二替换了参数一在数据库中
    db.colletion.update({name:"b"},{age:20})
    解决方案1:这样就只会更新对应的属性,还不是替换
    db.colletion.update({name:"b"},{$set:{age:20})
    解决方案2:或者使用replaceOne,其不会整体替换
    db.collection.replaceOne({name:"sdc"},{name:"sdasa"})
    - 只修改第一个符合条件的文档
    db.colletion.updateOne()
    - 同时修改符合多个条件的文档
    db.colletion.updateMany()
    
    
    
    
    栗子1:全文档更新,参数一为空,表示全部数据都匹配
    db.stu.update({},{name:'mnc'})
    此时只修改了第一条,但是第一条数据整个文档结构都变了
    例如:修改前时{"_id":ObjectId("523bjj24bk23"),"name":"gj1","gender":true}
    修改之后:{"_id":ObjectId("523bjj24bk23"),"name":"gj1"}
    
    为了避免上面的情况,通过$set进行指定属性的更新
    先插入一条数据:db.stu.insert({name:"hr",gender:0})
    修改:db.stu.update({name:'hr'},{$set:{name:'hys'}})
    这样修改就不会造成,整个文档的改变
    
    修改多条匹配到的数据
    db.stu.update({},{$set:{gender:0}},{multi:true})
    
    - $unset是根据参数一匹配,然后删除匹配到的第一条的name:"asdcjnacsasca"属性,注意不是删除整条,而且只匹配第一条age:20的document
    db.colletion.update({age:20},{$unset:{name:"asdcjnacsasca"}})
    

    保存


    db.集合名称.save(document)
    如果文档的_id已经存在则是修改,如果文档_id不存在则添加
    栗子:db.stu.save({_id:'20160102','name':'zq',gender:1})


    删除

    db.集合名称.remove(
        <query>,
        {
            justOne:<boolean>
        }
    )
    query:可选,删除的文档的条件
    justOne:可选,如果设为true或1,则只删除一条,默认false,删除多条
    栗子:
    删除第一条:db.stu.remove({gender:0},{justOne:true})
    全部删除:
    db.stu.remove({}) 一条条删除,性能低
    db.stu.drop()  整体删除,性能高
    
    - 只删除一个符合条件的文档
    - db.collection.deleteOne()
    - 删除所有符合的文档
    db.collection.deleteMany()
    

    查询


    db.集合名称.find({条件文档})
    db.集合名词.findOne({条件文档}) 只返回第一个
    db.集合名称.find({条件文档}).pretty() 将结果格式化


    补充

    - 多级结构
    db.hehe.insert(
        [
            {
                name:"asads",
                fav:{
                    movie:["a","b"]
                }
            }
        ]
    )
    - 给movie新加一个"星际穿越"
    db.hehe.update({name:"asads"},{$push:{
        "fav.movie":"星际穿越"
    }})
    说明:$set是整体替换,但是此时想新增,所以使用$push
    还有Bson支持.的形式调用,但是必须被“”包裹起来。
    同理还有$pop,$pull,$addToSet(和$set相似,但是不能重复添加)),$pushAll.$pullAll
    
    图一.png
    • 插入两万条数据
      var infos=[]
      for(var i=0;i<20000;i++){
      infos.push({age:i})
      }
      db.hehe.insert(infos)
      这样想比与一条条插入性能高了很多

    • 查询年纪在20和50之间的数据
      db.hehe.find({age:{gt:20,lt:50}})

    • 修改年纪为1的数据增加20(如果减20则age:-20即可)
      db.hehe.updateMany({age:1},{$inc:{age:20}})

    运算符


    等于 默认是等于判断,没有运算符
    小于lt 小于等于lte
    大于 gt 大于等于gte
    不等于 ne 栗子:查询年龄大于或等于18 的学生 db.stu.find({age:{gte:18}})


    逻辑运算符


    查询时可以有多个条件,多个条件之间需要通过逻辑运算符连接
    逻辑与:默认是逻辑与的关系
    栗子:查询年级大于等于18,并且性别为1的学生
    db.stu,find({age:{$gte:18},gender:1})

    逻辑或:使用or 查询年级大于18,或性别为0的学生 db.stu.find({or:[{age:{$gt:18}},{gender:1}]})

    and和or一起使用
    查询年龄大于18或性别为0的学生,并且学生的姓名为gj
    db.stu.find({or:[{age:{gt:18}},{gender:1}],{name:'gj'})


    范围运算符


    使用in(或),nin判断是否在某个范围
    查询年龄为18,28的学生,注意不是区间,指的是18/28只要有一个就符合
    db.stu.find({age:{$in:[18,28]}})


    全部匹配all


    使用all(且),代表全部匹配,必须18,28两个数据都匹配上,刚好和上面的in是一个是或一个是且 db.stu.find({age:{all:[18,28]}})


    正则表达式


    使用//或regex编写正则表达式 查询姓黄的学生 db.stu.find({name:/^黄/}) db.stu.find({name:{regex:'^黄'}})


    自定义查询


    使用where后面写一个函数,返回满足条件的数据 查询年级大于30的学生 db.stu.find({where:function(){return this.age>20}})


    数据查询


    方法limit():用于读取指定数量的文档
    db.集合名称.find().limit(number)
    参数number表示要获取的文档的条数,如果不指定则显示所有
    查询2条学生的数据
    db.stu.find().limit(2)

    方法skip():用于跳过指定数量的文档
    db.集合名称.find().skip(number)
    参数number表示跳过的记录条数,默认是0
    查询从第三条开始的学生信息
    db.stu.find().skip(2)

    上面两个可以一起使用,不分先后顺序
    查询第5至8条数据
    db.stu.find().limit(4).skip(5)或
    db.stu.find().skip(5).limit(4)


    投影


    在查询到得返回结果中,只选择必要得字段,而不是选择一个文档的整个字段
    参数为字段与值,值为1表示显示,值为0不显示
    db.集合名称.find({},{字段名称:1,.....})


    排序


    db.集合名称.find().sort({字段:1,....})
    参数1为升序排列
    参数-1为降序排列
    栗子:db.stu.find().sort({gender:-1,age:-1})


    统计个数


    方法count()用于统计结果集中文档条数
    db.集合名称.find({条件}).count()
    或者
    db.集合名称.count({条件})


    消除重复


    方法distinct()对数据去除重复
    db.集合名称.distinct('去重字段',{条件})
    栗子:查找年龄大于18的性别(去重)
    db.stu.distinct(gender,{age:{$gt:18}} )


    高级操作

    聚合 aggregate


    db.集合名称.aggregate([{管道:{表达式}])
    常用管道:
    group:将集合中的文档分组,可用于统计结果match: 过滤数据,只输出符合条件的文档
    project:修改输入文档的结构,如重命名、增加、删除、创建计算结果sort:将输入文档排序后输出
    limit:限制聚合管道返回的文档数skip:跳过指定数量的文档,并返回余下的文档
    $unwind:将数组类型的字段进行拆分


    针对Mongodb4.x

    安装

    • 新增选择是网络用户还是本地用户
    • 会选择log文件夹和文件文件夹
    • 而且会注册系统服务,不需要在mongod手动开启服务端

    Mongdb账户权限配置

    默认是全部开启,不需要用户名和密码,不安全

    • 创建超级管理员
    use admin
    db.createUser({
        user:'admin',
        pwd:'123456',
        roles:[{role:'root',db:'admin'}]
    })
    
    • 修改Mongodb数据库配置文件

    D:\DevelopSoft\MongoDB\bin\mongod.cfg
    配置:security:
    authorization: enabled 注意空格和编码以及换行符

    • 修改配置文件后重新启动mongodb服务
    • 使用超级管理员连接数据库

    mongo admin -u 用户名 -p 密码
    mongo 192.168.0.117:27017/test -u user -p password //远程连接

    • 创建指定用户,只能访问指定数据库
    use zengqiangdb
    db.createUser({
        user:'zengqiang',
        pwd:'123456',
        roles:[{role:'dbOwner',db:'zengqiangdb'}]
    })
    

    数据库角色

    • 数据库用户角色: read readWriter
    • 数据库管理角色: dbAdmin dbOwner userAdmin
    • 集群管理角色: clusterAdmin clusterManager cluserMonitor hostManager
    • 备份恢复角色: backup restore
    • 所有数据库角色: readAnyDatabase readWriteAnyDatabase userAdminAnyDatabase dbAdminAnyDatabase
    • 超级用户角色: root

    相关命令

    • show users:查看当前库的管理员
    • db.dropUser("zengqiang"):删除管理员
    • db.updateUser("zengqiang",{pwd:"password"}):修改用户密码
    • db.auth("admin","password"):密码认证

    例如:直接mongo admin连接不输入任何密码则show dbs是无效的,此时可以通过密码认证完成密码认证再show dbs等操作即可有效

    相关文章

      网友评论

          本文标题:MongoDB入门

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