MongoDB进阶操作

1 篇文章 0 订阅
1 篇文章 0 订阅

limit 和 skip

其中stu表为笔者的集合,读者应用时应换成自己的

limit 限制显示条数

db.stu.find().limit(2)

skip 跳过记录数

db.stu.find().skip(1)

【重点】如果limit和skip同时使用,先skip后limit不管先后顺序

db.stu.find().limit(2).skip(1)
db.stu.find().skip(1).limit(2)

投影

设置显示字段

设置显示方式(投影),设置为 1 表示字段显示,没有设置表示不显示,_id 默认显示,如果想让他不显示可以设置成 0

db.stu.find(
    // 查询条件
    {},
    // 设置显示方式(投影)
    {
        _id:0,
        name:1
    }
)

排序

排序条件:1升序,-1降序

db.stu.find().sort(
    // 排序条件
    {
        age:-1,
        gender:1
    }
)

统计个数

// 方式一
db.stu.find({}).count()
// 方式二
db.stu.count()

消除重复

db.stu.distinct(
    // 去重字段
    'hometown',
    // 查询条件
    {
        age:{$gt:15}
    }
)

聚合操作

find 用于查询数据,聚合(aggregate)主要用于计算数据和统计数据

语法

db.集合名称.aggregate([ 
    {管道类型 : {表达式}},
    {管道类型 : {表达式}},
    {管道类型 : {表达式}},
    ...
])

管道类型

  • List item

$group作用 按照某个字段进行分组,针对每组进行表达式计算

db.stu.aggregate([ 
        {
            $group : {
                // 第一个参数必须是 _id,传递的是字段名称之前必须添加$,如果想要所有数据作为一组可以把参数设置成 null
                _id:"null",//"$gender",
                // 表达式计算
                // "按照家乡记录总个数":{$sum:1},
                // 计算平均值
                // "平均年龄":{$avg:"$age"},
                // 计算最大值
                "最大年龄":{$max:"$age"},
                // 计算最小值
                "最小年龄":{$min:"$age"}
                // 把某个字段放入的统计列表中
                // "统计字段数据":{$push:"$$ROOT"}
            }
        }
    ])

$match 匹配出符合条件的数据,

db.stu.aggregate([ 
    // 匹配出大于20岁的记录
    {
        $match : {
            // 和 find 参数一样
            // 匹配条件
            age:{$gt:20}
        }
    },
    // 进匹配出的记录进行分组,获取所有的分组名称
    {
        $group: {
            _id:"$hometown",
            "名称":{$push:"$name"}
        }
    }
])

$project跟投影一样

db.stu.aggregate([ 
    // 匹配出大于20岁的记录
    {
        $match : {
            // 和 find 参数一样
            // 匹配条件
            age:{$gt:20}
        }
    },
    // 利用投影显示记录
    {
        $project: {
            // 参数和 投影参数一样
            name:1,
            _id:0
        }
    }
])

$ sort对数据进行排序

db.stu.aggregate([ 
    // 匹配出大于20岁的记录
    {
        $match : {
            // 和 find 参数一样
            // 匹配条件
            age:{$gt:20}
        }
    },
    {
        $sort:{
            // 参数和查询排序参数一样
            age:-1
        }
    }
])

$ limit 和 $skip

【注意】在管道中 $limit 和 $skip 有先后顺序

db.stu.aggregate([ 
    // 匹配出大于20岁的记录
    {
        $match : {
            // 和 find 参数一样
            // 匹配条件
            age:{$gt:16}
        }
    },
    {
        $skip:1
    },
    {
        $limit:2
    }
])

$unwind 作用是按照字段列表进行拆分数据,默认情况下管道会自动过滤 数组为空,null,不存在的字段数据,如果想不过滤设置 preserveNullAndEmptyArrays 为 true

db.t3.aggregate([
    {
        $unwind:"$size"
    }
])
// 不过滤数据
db.t3.aggregate([
    {
        $unwind:{
            // 设置拆分字段
            "path":'$size',
            // 不过滤数据
            preserveNullAndEmptyArrays:true
        }
    }
])

用于管道计算的表达式

  • $sum对数据进行累加操作
  • $avg平均值
  • $min最小值
  • $max最大值
  • $ push把某个字段放入的统计列表中,关键词$$ROOT表示整条数据
  • $first第一条
  • $last最后一条

索引

创建索引

db.t1.ensureIndex(
    // name 索引字段 值 1 升序,-1 降序 
    {name:1},
    // 设置唯一索引,默认不是唯一索引
    // unique 是去重的方式之一
    {"unique":true}
)

查询索引

db.t1.getIndexes()

删除索引

//  最好使用查询索引获取
db.t1.dropIndex('索引名称')

备份与恢复

备份

mongodump -h dbhost -d dbname -o dbdirectory

恢复

mongorestore -h dbhost -d dbname --dir dbdirectory

扩展备份写法(小服务器备份)

1.写一个 sh 脚本文件

    mysqldump -uroot -p123456 数据库名 | gzip > /backups/bk_$(date +%Y%m%d_%H%M%S).sql.gz
    mongodump -h dbhost -d dbname -o dbdirectory

2.利用 crontab 定时执行

验证模式

mongodb 默认情况下是没有任何限制的

开启验证模式

  1. 在执行时携带 --auth
  2. 在配置文件中配置 auth=true

实现验证模式

1.如果没有root账号必须先创建一个root账号,一旦创建成功账户系统立刻启动

// 进入管理员数据库
use admin
// 创建root账号
db.createUser(
    {
        "user":"python",
        "pwd":"123456",
        // 设置角色为 root
        "roles":["root"]
    }
)

2.管理员登录

    use admin
    // 如果返回1 表示登录成功
    db.auth('用户名','密码')

3.创建其他有权限的账号

    // 必须管理员登录
    use admin
    db.createUser(
        {
            "user":"db01",
            "pwd":"123456",
            // 设置权限账号
            "roles":[
                {
                    // 设置允许访问数据库名称
                    "db":"db_01",
                    //  访问数据库权限 read,write,readWrite
                    "role":"readWrite"
                }
            ]
        }
    )
    
    db.createUser(
        {
            "user":"db02",
            "pwd":"123456",
            // 设置权限账号
            "roles":[
                {
                    // 设置允许访问数据库名称
                    "db":"db_02",
                    //  访问数据库权限 read,write,readWrite
                    "role":"readWrite"
                }
            ]
        }
    )

4.查看用户列表

  // 必须管理员登录
    use admin
    show users

5.普通用户登录

   use admin
   db.auth('用户名','密码')

6.删除用户

  // 必须管理员登录
     use admin
  // 已被废弃
     db.removeUser('用户名')
  // 推荐使用
     db.dropUser('用户名')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值