MongoDB的高级查询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

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

数据模拟

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', toal: {$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}}}])
贡献者: mankueng