MongoDB 聚合管道(Aggregation Pipeline)

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: MongoDB 聚合管道(Aggregation Pipeline)

1. 聚合管道

使用聚合管道可对集合中的文档进行变换和组合。

应用场景:表关联查询、数据的统计。

MongoDB 中使用 db.COLLECTION_NAME.aggregate([{< stage >},…]) 方法 来构建和使用聚合管道。

先看下官网给的实例,感受一下聚合管道的用法。

2020062310470442.png

2. 管道操作符与表达式

image.png

image.png

管道表达式:

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

{ $match:{status:"A"}},$match 称为管道操作符,而 status:"A" 称为管道表达式, 是管道操作符的操作数(Operand)。 
每个管道表达式是一个文档结构,它是由字段名、字段值、和一些表达式操作符组成的。
常用表达式操作符 描述
$addToSet 将文档指定字段的值去重
$max 文档指定字段的最大值
$min 文档指定字段的最小值
$sum 文档指定字段求和
$avg 文档指定字段求平均
$gt 大于给定值
$lt 小于给定值
$eq 等于给定值

3. 数据模拟

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})

2020062310470442.png

$project

作用:修改文档的结构,可以用来重命名、增加或删除文档中的字段;

要求查找 order 只返回文档中 trade_no 和 all_price 字段

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

2020062310470442.png

$match

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

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

2020062310470442.png

$group

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

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

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

2020062310470442.png

$sort

作用:将集合中的文档进行排序

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

2020062310470442.png

$limit

作用:限制结果的数量

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

2020062310470442.png

$skip

作用:跳过文档的数量

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

2020062310470442.png

$lookup

作用:表关联

eg1:

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

结果:

{ 
  "_id": ObjectId("5b743d8c2c327f8d1b360540"), 
  "order_id": "1", 
  "uid": 10, 
  "trade_no": "111", 
  "all_price": 100, 
  "all_num": 2, 
  "items": [
    { "_id": ObjectId("5b743d9c2c327f8d1b360543"), "order_id": "1", "title": "商品鼠标 1", "price": 50, "num": 1 }, 
    { "_id": ObjectId("5b743da12c327f8d1b360544"), "order_id": "1", "title": "商品键盘 2", "price": 50, "num": 1 }, 
    { "_id": ObjectId("5b74f457089f78dc8f0a4f3b"), "order_id": "1", "title": "商品键盘 3", "price": 0, "num": 1 }
  ] 
} ,{ 
  "_id": ObjectId("5b743d902c327f8d1b360541"), 
  "order_id": "2", 
  "uid": 7, 
  "trade_no": "222", 
  "all_price": 90, 
  "all_num": 2, 
  "items": [
    { "_id": ObjectId("5b743da52c327f8d1b360545"), "order_id": "2", "title": "牛奶", "price": 50, "num": 1 }, 
    { "_id": ObjectId("5b743da92c327f8d1b360546"), "order_id": "2","title": "酸奶", "price": 40, "num": 1 }
  ]
}, { 
  "_id": ObjectId("5b743d962c327f8d1b360542"),  
  "order_id": "3", 
  "uid": 9, 
  "trade_no": "333", 
  "all_price": 20, 
  "all_num": 6, 
  "items": [
    { "_id": ObjectId("5b743dad2c327f8d1b360547"), "order_id": "3", "title": "矿泉水", "price": 2, "num": 5 }, 
    { "_id": ObjectId("5b743dff2c327f8d1b360548"), "order_id": "3", "title": "毛巾", "price": 10, "num": 1 }
  ] 
}

eg2

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}
  }, 
])

结果:

{ 
  "_id": ObjectId("5b743d8c2c327f8d1b360540"), 
  "trade_no": "111", 
  "all_price": 100, 
  "items": [
    { "_id": ObjectId("5b743d9c2c327f8d1b360543"), "order_id": "1", "title": "商品鼠标 1", "price": 50, "num": 1 }, 
    {"_id": ObjectId("5b743da12c327f8d1b360544"), "order_id": "1", "title": "商品键盘 2", "price": 50, "num": 1 }, 
      {"_id": ObjectId("5b74f457089f78dc8f0a4f3b"), "order_id": "1", "title": "商 品键盘 3", "price": 0, "num": 1 }
  ] 
}, { 
  "_id": ObjectId("5b743d902c327f8d1b360541"), 
  "trade_no": "222", 
  "all_price": 90, 
  "items": [
    { "_id": ObjectId("5b743da52c327f8d1b360545"), "order_id": "2", "title": "牛奶", "price": 50, "num": 1 }, 
    {"_id": ObjectId("5b743da92c327f8d1b360546"), "order_id": "2", "title": "酸奶", "price": 40, "num": 1}
  ] 
}


相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
9天前
|
SQL NoSQL Unix
MongoDB 聚合
10月更文挑战第17天
14 4
|
2月前
|
SQL NoSQL Unix
MongoDB聚合操作总结
这篇文章总结了MongoDB中聚合操作的作用、方法、常见聚合表达式以及聚合管道的概念和常用操作符,以及SQL与MongoDB聚合操作的对应关系。
37 2
MongoDB聚合操作总结
|
9天前
|
SQL NoSQL 数据处理
深入探索MongoDB的聚合操作
【10月更文挑战第13天】
8 0
|
2月前
|
NoSQL MongoDB 数据库
python3操作MongoDB的crud以及聚合案例,代码可直接运行(python经典编程案例)
这篇文章提供了使用Python操作MongoDB数据库进行CRUD(创建、读取、更新、删除)操作的详细代码示例,以及如何执行聚合查询的案例。
28 6
|
2月前
|
SQL NoSQL JavaScript
04 MongoDB各种查询操作 以及聚合操作总结
文章全面总结了MongoDB中的查询操作及聚合操作,包括基本查询、条件筛选、排序以及聚合管道的使用方法和实例。
63 0
|
3月前
|
持续交付 jenkins Devops
WPF与DevOps的完美邂逅:从Jenkins配置到自动化部署,全流程解析持续集成与持续交付的最佳实践
【8月更文挑战第31天】WPF与DevOps的结合开启了软件生命周期管理的新篇章。通过Jenkins等CI/CD工具,实现从代码提交到自动构建、测试及部署的全流程自动化。本文详细介绍了如何配置Jenkins来管理WPF项目的构建任务,确保每次代码提交都能触发自动化流程,提升开发效率和代码质量。这一方法不仅简化了开发流程,还加强了团队协作,是WPF开发者拥抱DevOps文化的理想指南。
68 1
|
3月前
|
NoSQL BI 数据处理
【超实用攻略】MongoDB 聚合框架:从入门到精通,带你解锁数据处理新姿势!
【8月更文挑战第24天】MongoDB是一款以其灵活性和高性能闻名的NoSQL数据库。其强大的聚合框架采用管道式处理,允许用户定义多个数据处理阶段如过滤、分组等。本文通过示例数据库`orders`和`products`,演示如何利用聚合框架计算各产品的总销售额。示例代码展示了使用`$lookup`连接两集合、`$unwind`打平数组及`$group`按产品ID分组并计算总销售额的过程。这突显了聚合框架处理复杂查询的强大能力,是进行数据分析和报表生成的理想选择。
40 3
|
3月前
|
存储 NoSQL JavaScript
MongoDB存储过程实战:聚合框架、脚本、最佳实践,一文全掌握!
【8月更文挑战第24天】MongoDB是一款备受欢迎的文档型NoSQL数据库,以灵活的数据模型和强大功能著称。尽管其存储过程支持不如传统关系型数据库,本文深入探讨了MongoDB在此方面的最佳实践。包括利用聚合框架处理复杂业务逻辑、封装业务逻辑提高复用性、运用JavaScript脚本实现类似存储过程的功能以及考虑集成其他工具提升数据处理能力。通过示例代码展示如何创建订单处理集合并定义验证规则,虽未直接实现存储过程,但有效地演示了如何借助JavaScript脚本处理业务逻辑,为开发者提供更多实用指导。
60 2
|
3月前
|
持续交付 jenkins C#
“WPF与DevOps深度融合:从Jenkins配置到自动化部署全流程解析,助你实现持续集成与持续交付的无缝衔接”
【8月更文挑战第31天】本文详细介绍如何在Windows Presentation Foundation(WPF)项目中应用DevOps实践,实现自动化部署与持续集成。通过具体代码示例和步骤指导,介绍选择Jenkins作为CI/CD工具,结合Git进行源码管理,配置构建任务、触发器、环境、构建步骤、测试及部署等环节,显著提升开发效率和代码质量。
69 0
|
3月前
|
测试技术 C# 开发者
“代码守护者:详解WPF开发中的单元测试策略与实践——从选择测试框架到编写模拟对象,全方位保障你的应用程序质量”
【8月更文挑战第31天】单元测试是确保软件质量的关键实践,尤其在复杂的WPF应用中更为重要。通过为每个小模块编写独立测试用例,可以验证代码的功能正确性并在早期发现错误。本文将介绍如何在WPF项目中引入单元测试,并通过具体示例演示其实施过程。首先选择合适的测试框架如NUnit或xUnit.net,并利用Moq模拟框架隔离外部依赖。接着,通过一个简单的WPF应用程序示例,展示如何模拟`IUserRepository`接口并验证`MainViewModel`加载用户数据的正确性。这有助于确保代码质量和未来的重构与扩展。
63 0