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'}]})
原文地址:https://www.cnblogs.com/greatfish/p/7769217.html