一、使用MongoDB
聚合管道(Aggregation Pipeline
)可以实现的功能
- 1、使用聚合管道可以对集合中的文档进行变换和组合。
- 2、实际项目:表关联查询、数据的统计。
二、聚合管道的使用方式
- 1、使用方式
db.collection_name[表名].aggregate([{}, {},....])
- 2、使用的效果展示
三、基本的命令集合
-
1、
mongodb aggregation
管道操作符和表达式No 管道操作符 描素 1 $project
增加、删除、重命名字段(查询的字段) 2 $match
条件匹配查询,只有符和条件的数据才能查询出来 3 $limit
限制结果的数量 4 $skip
跳过文档的数量 5 $sort
排序 6 $group
根据条件分组 7 $lookup
用来引入别的集合(多表查询) 关于
$lookup
的几个参数介绍NO 字段 描素 1 from
同一个数据库下等待被 Join
的集合2 localField
源集合中的 match
值,如果输入的集合中,某文档没有localField
这个Key(Field)
,在处理的过程中,会默认为此文档含有localField:null
的键值对。3 foreignField
待 Join
的集合的match
值,如果待Join
的集合中,文档没有foreignField
值,在处理的过程中,会默认为此文档含有foreignField:null
的键值对。4 as
为输出文档的新增值命名。如果输入的集合中已存在该值,则会覆盖掉 - 2、
mongodb
中与mysql
中的对比
No mysql
mongodb
描素 1 where
$match
查询条件 2 group by
$group
分组查询 3 having
$match
查询条件 4 order by
$sort
排序 5 limit
$limit
限制 6 sum
$sum
求和 7 count
$sum
计数 8 join
$lookup
表关联 9 select
$project
选择字段 - 3、管道表达式
- 管道操作符作为”键”,所对应的“值”叫做管道表达式
{$match:{status:"A"}},$match
称为管道操作符,而status:"A"
称为管道表达式, 是管道操作符的操作数(Operand
)- 常见的管道表达式操作符
No 表达式操作符 描素 1 $addToSet
将稳定指定字段的值去重 2 $max
文档指定字段的最大值 3 $min
文档指定字段的最小值 4 $sum
文档指定字段求和 5 $avg
文档指定字段求平均值 6 $gt
大于给定的值 7 $lt
小于给定的值 8 $eq
等于给定的值 9 gte
大于等于给定的值 10 lte
小于等于给定的值
四、数据操作
- 1、登录数据库并且创建数据库
# 登录数据库
mongo
# 查看全部的数据库
show dbs
# 使用哪个数据库【如果当前没这个数据可以就是创建,之前有就是使用。如果是创建必须先插入一条数据使用show dbs才可以看到】
use 数据库名
# 查看当前使用的是哪个数据库
db
- 2、模拟数据插入到
mongodb
中
-- 订单
db.order.insert({"order_id":"1","uid":10,"trade_no":"111","all_price":100,"all_num":2}) db.order.insert({"order_id":"2","uid":7,"trade_no":"222","all_price":90,"all_num":2}) db.order.insert({"order_id":"3","uid":9,"trade_no":"333","all_price":20,"all_num":6})
-- 订单列表
db.order_item.insert({"order_id":"1","title":"商品鼠标 1","price":50,num:1}) db.order_item.insert({"order_id":"1","title":"商品键盘 2","price":50,num:1}) db.order_item.insert({"order_id":"1","title":"商品键盘 3","price":0,num:1})
db.order_item.insert({"order_id":"2","title":"牛奶","price":50,num:1}) db.order_item.insert({"order_id":"2","title":"酸奶","price":40,num:1})
db.order_item.insert({"order_id":"3","title":"矿泉水","price":2,num:5}) db.order_item.insert({"order_id":"3","title":"毛巾","price":10,num:1})
- 3、
$project
只查询出想要的字段
-- db.order.aggregate([])
db.getCollection('order').aggregate([
{
$project: {trade_no:1,all_price:1} -- 表示只查询出trade_no和all_price字段
}
])
- 4、
$match
过滤数据
db.getCollection('order').aggregate([
{
$project: {trade_no:1,all_price:1}
},
{
-- 对上面查询的结果进行过滤,只查询出价格大于等于90的
$match: {all_price: {$gte: 90}}
}
])
- 5、
$group
分组查询
db.order_item.aggregate([
{
-- 根据order_id字段来分组求和,求和字段是$num
$group: {_id: "$order_id", total: {$sum: "$num"}}
}
])
- 6、
$sort
排序
db.order.aggregate([
{
$project: {order_id: 1, all_price: 1}
},
{
$match: {all_price: {$gte: 90}}
},
{
-- -1表示降序,1表示升序
$sort: {all_price: -1}
}
])
- 7、
$limit
表示限制返回多少条
db.order.aggregate([
{
$project: {order_id: 1, all_price: 1}
},
{
$match: {all_price: {$gte: 90}}
},
{
$sort: {all_price: -1}
},
{
$limit: 1
}
])
- 8、
$skip
跳过多少条(从多少条数据开始)
db.order.aggregate([
{
$project: {order_id: 1, all_price: 1}
},
{
$match: {all_price: {$gte: 90}}
},
{
$sort: {all_price: -1}
},
{
$limit: 1
},
{
$skip: 1
}
])
- 9、
$lookup
关联查询
db.order.aggregate([
{
$lookup: {
from: "order_item",
localField: "order_id",
foreignField: "order_id",
as: "item"
}
}
])
db.order.aggregate([
{
$match: {all_price: {$gte: 90}}
},
{
$lookup: {
from: "order_item",
localField: "order_id",
foreignField: "order_id",
as: "item",
}
}
])
db.order.aggregate([
{
$match: {all_price: {$gte: 90}}
},
{
$lookup: {
from: "order_item",
localField: "order_id",
foreignField: "order_id",
as: "item",
}
},
{
-- 需要显示的字段
$project: {"all_price": 1, "all_num": 1, "item.title": 1}
}
])