mongoose 系列之六 aggregate聚合管道

2,749 阅读1分钟

MongoDB聚合管道简介

  • 使用聚合管道可以对集合中的文档进行变换和组合
  • 实际项目:多表关联查询、数据的统计
  • MongoDB中使用 db.COLLECTION_NAME.aggregate([{},...])方法来构建和使用聚合管道

aggregate

MongoDB 管道操作符与表达式

管道操作符 简介
$project 筛选文档中指定的字段
$match 传递指定条件过滤满足条件的文档
$limit 获取指定数量的文档
$skip 跳过指定数量的文档
$sort 对集合中的文档进行排序
$group 对集合中的文档进行分组,可用于统计结果。
$lookup $lookup操作符用以引入其它集合的数据(用作多表关联查询)

订单数据模拟

db.order.insert({"order_id":"1","uid":10,"trade_no":"111","total_price":200,"total_number":2})
db.order.insert({"order_id":"2","uid":7,"trade_no":"222","total_price":70,"total_number":2})
db.order.insert({"order_id":"3","uid":9,"trade_no":"333","total_price":120,"total_number":6})

db.order_item.insert({"order_id":"1","title":"蛇灵键盘","price":50,number:1})
db.order_item.insert({"order_id":"1","title":"鼠标","price":50,number:1})
db.order_item.insert({"order_id":"1","title":"Usb转换器","price":0,number:1})

db.order_item.insert({"order_id":"2","title":"三只松鼠小礼包","price":50,number:1})
db.order_item.insert({"order_id":"2","title":"原味辣条","price":40,number:1})

db.order_item.insert({"order_id":"3","title":"矿泉水","price":2,number:5})
db.order_item.insert({"order_id":"3","title":"牙刷","price":10,number:1})

$project

筛选文档中指定的字段


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

$match

传递指定条件过滤满足条件的文档

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

$group

对集合中的文档进行分组,可用于统计结果。例如:按照订单号分组,统计每个订单的购买的商品总量

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

分组后聚合操作求和

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

$sort

对集合中的文档进行排序

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

])

$limit

获取指定数量的文档

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

])

$skip

跳过指定数量的文档

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

])

$lookup表关联

$lookup操作符用以引入其它集合的数据(用作多表关联查询)

db.order.aggregate([
    {
      $lookup:
        {
          from: "order_item",
          localField: "order_id",
          foreignField: "order_id",
          as: "itemInfo"
        }
   }
])