zoukankan      html  css  js  c++  java
  • MangoDB学习笔记

    01. 数据库操作
        1. 查看当前数据库名称
            db
        2. 查看所有数据库名称,列出所有在物理上存在的数据库
            show dbs;
        3. 切换数据库,如果数据库不存在也并不创建,直到插入数据或创建集合时数据库才被创建
            use 数据库名称
        4. 删除当前指向的数据库,如果数据库不存在,则什么也不做
            db.dropDatabase()
    
    02. 集合操作
        01. 创建集合
            1. 不限制集合大小
                db.createCollection(name)
            2. 限制集合大小
                db.createCollection(name, { capped : true, size : 10 } )
                    name    创建的集合名
                    capped    默认值为false表示不设置上限,值为true表示设置上限
                    size    当capped值为true时,需要指定此参数,表示上限大小,当文档达到上限时,会将之前的数据覆盖,单位为字节
    
        02. 查看当前数据库的集合
            show collections
    
        03. 删除集合
            db.集合名称.drop()
    
        04. 当前集合的状态
            db.集合名.stats()
    
    03. 数据类型
        Object ID        文档ID
            每个文档都有一个属性,为_id,保证每个文档的唯一性
            可以自己去设置_id插入文档
            如果没有提供,那么MongoDB为每个文档提供了一个独特的_id,类型为objectID
            objectID是一个12字节的十六进制数
                前4个字节为当前时间戳
                接下来3个字节的机器ID
                接下来的2个字节中MongoDB的服务进程id
                最后3个字节是简单的增量值
        String            字符串,最常用,必须是有效的UTF-8
        Boolean            存储一个布尔值,true或false
        Integer            整数可以是32位或64位,这取决于服务器
        Double            存储浮点值
        Arrays            数组或列表,多个值存储到一个键
        Object            用于嵌入式的文档,即一个值为一个文档
        Null            存储Null值
        Timestamp        时间戳,表示从1970-1-1到现在的总秒数
        Date            存储当前日期或时间的UNIX时间格式
            创建日期语句如下
            注意:参数的格式为YYYY-MM-DD
            new Date('2017-12-20')
    
    04. 数据的增删改
        1. 插入数据(可以不用事先创建集合而直接使用)
            db.集合名称.insert(document)
    
        2. 更新数据
            db.集合名称.update(<query>, <update>, {multi: <boolean>})
                query        查询条件
                update:更新操作符,类似sql语句update中set部分
                    1. 当为一个文档时,则用这个文档替换查询到的文档
                    2. 通过$set更新指定的列{$set:{列:值}},如果列不存在,则会新添加一列。
                    3. 通过$unset删除指定的字段{$unset:{字段:''}}
    
                multi:可选,默认是false,表示只更新找到的第一条记录,值为true表示把满足条件的文档全部更新
    
        3. 保存
            db.集合名称.save(document)
                如果document指定了_id,则修改,没有指定则添加到集合。
    
        4. 删除数据
            db.集合名称.remove(<query>, {justOne: <boolean>})
                query        可选,删除的文档的条件
                justOne        可选,如果设为true或1,则只删除一条,默认false,表示删除多条
    
    05. 查询
        01. 基本查询
            1. db.集合名称.find({条件文档})                根据条件查询
            2. db.集合名称.findOne({条件文档})                只查询一条数据
            3. db.集合名称.find({条件文档}).pretty()        将结果格式化
    
        02. 比较运算符
            $lt     相当于<   例如:{age:{$lt:20}} 相当于age<20
            $lte    相当于<=
            $gt     相当于>
            $gte     相当于>=
            $ne     相当于!=
    
        03. 逻辑运算符
            1. 在{}中写的多个条件相当于and
                {age:18, gerder:false} 相当于age=18 and gender=false
            2. 或运算 $or
                {$or:[{},{}...]}     所有条件写在[]中
    
        04. 范围运算符
            $in $nin
                {age:{$in:[18,20]}}     相当于age=18或者age=20
    
        05. 正则表达式
            方法1:正则表达式放在//中
                {name:/师$/}     name以师结尾
            方法2:
                {name:{$regex:师$}} name以师结尾
    
        06. 自定义查询
            使用$where后面写一个js函数,返回满足条件的数据
            对集合中所有的数据执行函数,如果返回true,则该条数据有效,否则过滤掉这条数据
            如:
                db.stu.find({
                $where:function() {
                return this.age > 30;
                }
                })
    
        07. 分页查询
            db.集合名称.find().skip(m).limit(n)
                跳过m条数据选择n条
                其中skip()和limit()可以互换位置而不影响结果
    
        08. 投影
            在一条文档中选择其中的几个字段
            db.集合名称.find({条件},{字段名称:1,...})
                _id默认为显示,为0则表示不显示,其他字段若不想显示则不写即可,写为0反而会报错
                1表示显示该字段
    
        09. 排序
            db.集合名称.find().sort({字段:1,...})
                参数1表示升序
                参数-1表示降序
    
        10. 统计个数
            写法1:    db.集合名称.find({条件}).count()
            写法2    db.集合名称.count({条件})
    
        11. 去重
            db.集合名称.distinct('去重字段',{条件})
    
    06. 聚合
        01. 介绍
            聚合(aggregate)主要用于计算数据,类似sql中的sum()、avg()
        02. 语法
            db.集合名称.aggregate({管道:{表达式}})
                管道        在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的输入;在mongodb中,管道具有同样的作用,文档处理完毕后,通过管道进行下一次处理
                表达式        '$列表' 处理输入文档并输出 '$列表'
    
        03. 常见管道
            01. $group:将集合中的文档分组,可用于统计结果
                _id     表示分组的依据,倘若写为Null,则把整个集合当做一组
                如:统计男生女生的总人数
                    db.stu.aggregate(
                    {$group:
                        {
                            _id:'$gender',
                            counter:{$sum:1}
                        }
                    }
                    )
            02. $match:过滤数据,只输出符合条件的文档
                如:查询年龄大于20的男生、女生人数
                    db.stu.aggregate(
                        {$match:{age:{$gt:20}}},
                        {$group:{_id:'$gender',counter:{$sum:1}}}
                    )
    
            03. $project:修改输入文档的结构,如重命名、增加、删除字段、创建计算结果
                如:查询男生、女生人数,输出人数
                    db.stu.aggregate(
                        {$group:{_id:'$gender',counter:{$sum:1}}},
                        {$project:{_id:0,counter:1}}
                    )
            04. $sort:将输入文档排序后输出
                如:查询男生、女生人数,按人数降序
                    db.stu.aggregate(
                        {$group:{_id:'$gender',counter:{$sum:1}}},
                        {$sort:{counter:-1}}
                    )
            05. $limit:限制聚合管道返回的文档数
            06. $skip:跳过指定数量的文档,并返回余下的文档
                如:统计男生、女生人数,按人数升序,取第二条数据
                    db.stu.aggregate(
                        {$group:{_id:'$gender',counter:{$sum:1}}},
                        {$sort:{counter:1}},
                        {$skip:1},
                        {$limit:1}
                    )
                注意:
                    聚合中的skip和limit顺序不能写反
            07. $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值
                1. 语法:
                    语法1. db.集合名称.aggregate({$unwind:'$字段名称'})
                    语法2    
                        db.集合名称.aggregate({
                            $unwind:{
                                path:'$字段名称',                        #拆分的字段名
                                preserveNullAndEmptyArrays:<boolean>     #防止数据丢失
                            }
                        })
    
                2. 解释
                    对于语法1,如果某条记录该字段为NULL,空数组或者没有该字段则这条记录就会丢弃不显示在结果集中
                    对于语法2,属性preserveNullAndEmptyArrays值为true表示保留属性值为空的文档,为false则丢弃
    
        04. 常见表达式
                $sum:计算总和,$sum:1 表示以一倍计数
                $avg:计算平均值
                $min:获取最小值
                $max:获取最大值
                $push:在结果文档中插入值到一个数组中,例如根据性别分组后,可以把当前性别这一组中的所有人的名字放到一个字段中
                    {$push:'$字段名'}
                    {$push:'$$ROOT'}将文档所有内容加入到结果集中
                $first:根据资源文档的排序获取第一个文档数据
                $last:根据资源文档的排序获取最后一个文档数据
    
    07. 索引
        1. 创建索引
            1. 创建索引
                db.集合.ensureIndex({属性:1})
                    参数1表示升序,-1表示降序
    
            2. 创建多列索引
                db.集合名.ensureIndex({属性1:1,属性2:1})
                    查找时,只有包含第一个属性,索引才会生效
    
            3. 创建唯一索引
                db.集合名.ensureIndex({属性:1},{unique:true})
                    集合中有重复数据无法创建
                    创建索引后仍可以插入重复数据
    
            4.添加数据时,没有指定_id,自动创建_id,且给_id创建索引
        2. 查看索引
            db.集合名.getIndexes()
    
        3. 删除索引
            db.集合名.dropIndex(索引名)
    
    08 数据备份
        mongodump -h dbhost -d dbname -o dbdirectory
            -h:服务器地址,也可以指定端口号,在本机上备份可以不用指定该项
            -d:需要备份的数据库名称
            -o:备份的数据存放位置,此目录中存放着备份出来的数据
    
    09. 数据恢复
        mongorestore -h dbhost -d dbname --dir dbdirectory
            -h:服务器地址,在本机上备份可以不用指定该项
            -d:需要恢复的数据库名
            --dir:备份数据所在位置
    
    10. 用户管理
        MongoDB中创建用户,只能在某个数据库上创建用来管理这个数据库的指定角色的用户
        常见角色:
            root: 只在 admin 数据中可使用,超级账户,超级权限
            Read: 允许用户读取指定的数据库
            readWrite: 允许用户读写指定的数据库
        1. 创建超级用户
            use admin
            db.createUser(
            {
                user:'admin',
                pwd:'123',
                roles:[{role:'root',db:'admin'}]
            }
            )
    
        2. 创建普通用户
            1. 使用admin登录
            2. use demo
            3. db.createUser(
                    {
                        user:'用户名',
                        pwd:'密码'
                        roles:[{role:'readWrite',db:'demo'}]
                    }
                )
    
        3. 启用安全验证
            1. 修改配置文件
                vi /etc/mongod.conf
                    security:
                        authorization: enabled
    
            2. 重启服务
                sudo service mongod restart
    
        4. 使用用户登录
            mongo -u 用户名 -p 密码 --authenticationDatabase 数据库名
    
        5. 修改用户
            1. 修改密码
                db.updateUser('用户名',{pwd: '456'})
            2. 修改角色
                db.updateUser('用户名',{roles:[{role: 'read',db:'demo'}]})
  • 相关阅读:
    DockerFile构建镜像
    docker基本命令
    docker持久化
    JS 中 this 指向问题
    解决"/usr/local/bin/dockercompose: Permission denied"问题
    docker配置国内镜像
    docker网络
    国内常用镜像地址
    Visual Studio中快捷键收缩和展开代码段方法
    STM32中关于RCC时钟的理解
  • 原文地址:https://www.cnblogs.com/greatfish/p/7769217.html
Copyright © 2011-2022 走看看