原文连接

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

MongoDB聚合管道简介 - 图1

MongoDB 管道操作符与表达式

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

订单数据模拟

  1. db.order.insert({"order_id":"1","uid":10,"trade_no":"111","total_price":200,"total_number":2})
  2. db.order.insert({"order_id":"2","uid":7,"trade_no":"222","total_price":70,"total_number":2})
  3. db.order.insert({"order_id":"3","uid":9,"trade_no":"333","total_price":120,"total_number":6})
  4. db.order_item.insert({"order_id":"1","title":"蛇灵键盘","price":50,number:1})
  5. db.order_item.insert({"order_id":"1","title":"鼠标","price":50,number:1})
  6. db.order_item.insert({"order_id":"1","title":"Usb转换器","price":0,number:1})
  7. db.order_item.insert({"order_id":"2","title":"三只松鼠小礼包","price":50,number:1})
  8. db.order_item.insert({"order_id":"2","title":"原味辣条","price":40,number:1})
  9. db.order_item.insert({"order_id":"3","title":"矿泉水","price":2,number:5})
  10. db.order_item.insert({"order_id":"3","title":"牙刷","price":10,number:1})
  11. 复制代码

$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"
        }
   }
])

作者:虎哥说IT
链接:https://juejin.im/post/6844904008537243661
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。