mongodb的高级查询aggregate聚合管道
一、MongoDB 聚合管道(Aggregation Pipeline)
使用聚合管道可以对集合中的文档进行变换和组合。
**实际项目:**表关联查询、数据的统计。
MongoDB 中使用 db.COLLECTION_NAME.aggregate([{},…]) 方法
来构建和使用聚合管道。
二、MongoDB Aggregation 管道操作符与表达式
1.管道操作符
2.mysql和mongodb对比
3.管道表达式
管道操作符作为“键”,所对应的“值”叫做管道表达式。
例如{KaTeX parse error: Expected 'EOF', got '}' at position 19: …ch:{status:"A"}}̲,match 称为管道操作符,而 status:"A"称为管道表达式,
是管道操作符的操作数(Operand)。
每个管道表达式是一个文档结构,它是由字段名、字段值、和一些表达式操作符组成的。
三、数据模拟
这接在数据库创建dadi的数据库,表包含order, order_item
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})
四、$project
作用:返回指定字段
例子:例如order_item表中有10个字段,现要求返回title, price字段
db.order_item.aggregate([
{
$project: {title: 1, price: 1}
}
])
五、$match
作用:添加筛选条件
例子:接上个例子,返回价格 >= 30的数据
db.order_item.aggregate([
{
$project: {title: 1, price: 1}
},
{
$match: {'price': {$gte: 30}}
}
])
六、$group
作用:数据分组并统计结果
例子:order_item表中有多个订单,每个订单下有多个商品,现在要计算每个订单中所有商品的总数量
db.order_item.aggregate([
{
$group: {_id:"$order_id", total: {$sum: 1}}
}
])
七、$sort
作用:排序
例子:order_item表中取price字段,并排序
注 :1:升序,2:降序
db.order_item.aggregate([
{
$project: {title: 1, price: 1}
},
{
$sort: {'price': 1}
}
])
八、$limit
作用:限制返回的数量
例子:排序之后返回前三名
注:多用于分页
db.order_item.aggregate([
{
$project: {title: 1, price: 1}
},
{
$sort: {'price': 1}
},
{
$limit: 3
}
])
九、$skip
作用:跳过几条数据
例子:排序之后(7条),跳过一条数据,返回剩下是的数据(6条)
db.order_item.aggregate([
{
$project: {title: 1, price: 1}
},
{
$sort: {'price': 1}
},
{
$skip: 1
}
])
十、$lookup 表关联
1.简单例子
db.order.aggregate([
{
$lookup:{
from: 'order_item',
localField: 'order_id',
foreignField: 'order_id',
as: 'items'
}
}
])
2.复杂的例子
// 表关联+显示字段+筛选+排序
db.order.aggregate([
{
$lookup:{
from: 'order_item',
localField: 'order_id',
foreignField: 'order_id',
as: 'items'
}
},
{
$project: {trade_no: 1, all_price: 1, items: 1}
},
{
$match: {'all_price': {$gte:90}}
},
{
$sort: {'all_price': -1}
},
])