MongoDB 的高级查询 aggregate 聚合管道

一、MongoDB 聚合管道(Aggregation Pipeline)

使用聚合管道可以对集合中的文档进行变换和组合。
实际项目:表关联查询、数据的统计。
MongoDB 中使用db.COLLECTION_NAME.aggregate([{},…]) 方法来构建和使用聚合管道。先看下官网给的实例,感受一下聚合管道的用法。

在这里插入图片描述
二、MongoDB Aggregation 管道操作符与表达式

管道操作符Description
$project增加、删除、重命名字段(显示的字段筛选)
$match条件匹配。只满足条件的文档才能进入下 一阶段 (查询条件)
$limit限制结果的数量
$skip跳过文档的数量
$sort条件排序。
$group条件组合结果统计
$lookup$lookup 操作符 用以引入其它集合的数 据 (表关联查询)

SQL 和 NOSQL 对比:

SQLNOSQL
WHERE$match
GROUP BY$group
HAVING$match
SELECT$project
ORDER BY$sort
LIMIT$limit
SUM()$sum
COUNT()$sum
join$lookup

管道表达式: 管道操作符作为“键”,所对应的“值”叫做管道表达式。

例如{KaTeX parse error: Expected 'EOF', got '}' at position 19: …ch:{status:"A"}}̲,match 称为管道操作符,而 status:"A"称为管道表达式, 是管道操作符的操作数(Operand)。

每个管道表达式是一个文档结构,它是由字段名、字段值、和一些表达式操作符组成的。

常用表达式操作符Description
$addToSet将文档指定字段的值去重
$max文档指定字段的最大值
$min文档指定字段的最小值
$sum文档指定字段求和
$avg文档指定字段求平均
$gt大于给定值
$lt小于给定值
$eq等于给定值

三、 数据模拟

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 只返回文档中 trade_no 和 all_price 字段

db.order.aggregate([ { $project:{ trade_no:1, all_price:1 } } ])

五、 $match

用于过滤文档。用法类似于 find() 方法中的参数。

db.order.aggregate([ 
	{ $project:{ trade_no:1, all_price:1 } },
	{ $match:{"all_price":{$gte:90}} } 
])

六、 $group

将集合中的文档进行分组,可用于统计结果。

统计每个订单的订单数量,按照订单号分组

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

七、 $sort
将集合中的文档进行排序。

db.order.aggregate([ 
	{ $project:{ trade_no:1, all_price:1 } }, 
	{ $match:{"all_price":{$gte:90}} }, 
	{ $sort:{"all_price":-1} } 
])

八、 $limit

db.order.aggregate([ 
	{ $project:{ trade_no:1, all_price:1 } }, 
	{ $match:{"all_price":{$gte:90}} }, 
	{ $sort:{"all_price":-1} }, 
	{ $limit:1 } 
])

九、 $skip

db.order.aggregate([ 
	{ $project:{ trade_no:1, all_price:1 } }, 
	{ $match:{"all_price":{$gte:90}} }, 
	{ $sort:{"all_price":-1} },
	{ $skip:1 } 
])

十、 $lookup 表关联

db.order.aggregate([ 
	{ 
		$lookup: { 
			from: "order_item", 
			localField: "order_id", 
			foreignField: "order_id", 
			as: "items" 
		} 
	} 
])
db.order.aggregate([ 
	{ 
		$lookup:{ 
			from: "order_item", 
			localField: "order_id", 
			foreignField: "order_id", 
			as: "items" 
		} 
	}, 
	{ 
		$match:{
			"all_price":{$gte:90}
		} 
	} 
])
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}}
])
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值