Mongodb数据库入门系列(三)

这是mongodb数据库入门系列的最后一篇,关于mongodb高级查询aggregate聚合管道使用方法的一些总结,还有数据的备份导出和还原导入的总结,想看CRUD功能和索引、用户权限的可以查看我的第一篇第二篇文章。

1、聚合管道(aggregate)

聚合管道我个人理解其实就是对数据库表里面的数据进行一系列(多个)操作(比如根据某些条件进行过滤,分组、数量的统计等等),主要用于表的关联查询、数据的统计。

常用的管道操作符:

$project:查询指定字段

$match:条件匹配,满足条件进入下一阶段

$limit:限制结果的数量,可以和$skip一起使用用于实现分页

$skip:跳过数据的数量,可以和$limit一起使用用于实现分页

$sort:条件排序

$group:分组统计,常常和$sum一起使用

$lookup:$lookup操作符,用来引入其他集合的数据,表的关联查询

聚合的一些表达式:

$sum:求和

$avg:求平均值

$min:获取最小值

$max:获取最大值

$push:数组中插入值

$first:获取第一个

$last:获取最后一个

用法演示:

首先创建两个有一些关联关系的表 通过order_id一对多关联,order和order_item,就是一个订单表和要给订单详情类似,数据字段如下

 可以看出来我们的order_item前三条数据订单1的,后两条属于订单2的。

$project:查找order中的数据只需要展示 order_id 和 uid,在之前的文章里面中介绍过一种方法  db.order.find({}, { order_id: 1, uid: 1 }) 这样也可以实现,使用 $project实现:

db.order.aggregate([{ $project: { order_id: 1, uid: 1 } }])     // 聚合管道的结构就是 db.order.aggregate([ {}, {}, {} ])  

$match:过滤文档,和 find() 中的过滤条件一样,例如分别接着上面的找出 uid 大于7的,还有 uid 小于 10的数据

db.order.aggregate([{ $project: { order_id: 1, uid: 1 } }, { $match: { uid: { $gt: 7 } } }])

$group:分组

 db.order_item.aggregate([{ $group: { _id: '$order_id', total: { $sum: 1 } } }])

ps:其中的_id表示按照什么进行分组,'$order_id' 表示按照 order_id 分组,后面的把 num 进行相加进行统计数量,这里需要注意的就是 $ 符号的使用。

$sort:排序 1 正序,-1 倒序

db.order_item.aggregate([{ $project: { title: 1, price: 1 } }, { $match: { price: { $gte: 50 } } }, { $sort: { price: 1 } }])   // 查询 order_item 表,只展示title、price字段,过滤出price大于等于50的数据,并按正序排序

$limit:限制返回的数据数量

$skip:查询结果跳过几条之后返回

示例:对上面的操作结果基础上进行添加筛选条件

db.order_item.aggregate([{ $project: { title: 1, price: 1 } }, { $match: { price: { $gte: 50 } } }, { $sort: { price: -1 } }, { $limit: 2 }])   // 限制返回两条数据

db.order_item.aggregate([{ $project: { title: 1, price: 1 } }, { $match: { price: { $gte: 50 } } }, { $sort: { price: -1 } }, { $limit: 2 }, { $skip: 1 }])   // 在返回的两条数据基础上,跳过第一条数据只展示第二条

 $lookup:关联表

我们关联 order 和 order_item 表返回这样的结构:

[{
    order_id: '',  // 从order表中获取
    trade_no: '',  // 从order表中获取
    items: [
        {
            title: '', // 从对应的order_id的order_item表中获取
            price: '' // 从对应的order_id的order_item表中获取
        },
        ...
    ]
},
...]

语法:

db.order.aggregate([    // order 是关联表
    { 
        $lookup: {                     // 固定结构写法
            from: 'order_item',        // order_item被关联表
            localField: 'order_id',    // 关联表的关联字段(id)
            foreignField: 'order_id'   // 被关联表的关联字段(id),和localField不一定一样
            as: 'items'                // 两个表关联查询之后把被关联的数据放到哪里
        }
    }
])

返回结果:

2、补充:数据库备份(导出)和还原(导入)

1、启动mongodb数据库

2、打开cmd 输入 mongodump -h 数据库IP地址 -d 想备份的数据库名称 -o 导出的路径

ps:这里有一个坑需要说明一下,我们呢下载得mongodb数据库可能缺少一些工具集,也就是会发现 mongodump  命令不是内部或外部命令,这个时候我们需要去官网下载

把下载得工具集文件里面bin下面的全部工具集放到mongodb安装位置得bin目录下面:

放到mongodb的bin目录下:

这次我们在执行导出就没问题了:现在c盘下面创建一个 db 的空文件夹,我们本地又要给 shop 数据库,我要将其导出到这个 db 文件夹中 (见下图)

mongodump -h 127.0.0.1:27017 -d shop -o C:\db

ps:这里在后来的操作中我发现了一个问题,我需要补充一点 就是我们导出的文件夹 最好不要创建在我们启动mongodb数据库的那个设置的--dbpath的保存data的文件里面,不然可能出现导出失败

 

 导出后结果:

 这样就完成了数据库的备份。

3、进行还原操作,先把 shop 数据库删除掉

4、 执行还原命令  mongorestore -h 数据库IP地址 -d 数据库名称(自己任意命名) 导入数据库的路径

mongorestore -h 127.0.0.1 -d shop C:\db\shop

 

ps:这里需要补充一点的是进行备份(导出)、导入(还原)操作的时候不能再我们连接mongodb的那个终端继续操作,数据库的ip地址我们加不加端口号都可以默认就是27017,需要使用 cmd 重新打开一个终端操作。

5、如果数据库有用户名和密码认证(不是超级管理员的时候)的时候的备份和还原:

mongodump -h 数据库IP地址 -d 想备份的数据库名称 -u 用户名 -p 密码  -o 导出的路径

mongorestore -h 数据库IP地址 -d 数据库名称(自己任意命名) 导入数据库的路径  -u 用户名 -p 密码

如图:

 

 

 

mongodb数据库的内容大体总结了这些,也当作是自己的一个笔记,如果后续还有关于mongodb的还会继续补充, 这篇的图片截图比较多,写的不好的或者有疑问的大家可以留言讨论,感觉还可以有帮助的可以点赞打赏一下。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值