当前位置: 首页 > news >正文

mongo db聚合查询

MongoDB 的聚合管道(Aggregation Pipeline)是处理数据最强大的工具。你可以把它想象成一个数据处理工厂的流水线:文档(数据)从一端进入,经过一系列的处理阶段(Stage),最后从另一端输出你想要的结果。

在 Go 语言中,使用官方驱动 mongo-driver 操作聚合管道非常直观。下面我为你详细拆解它的核心用法。


🛠️ 核心概念:流水线 (Pipeline)

聚合管道由多个阶段(Stages)组成,每个阶段执行特定的操作,上一个阶段的输出是下一个阶段的输入。

在 Go 中,我们通常使用 bson.D(保持顺序的文档)或 bson.A(数组)来构建管道。

基本语法结构:

pipeline := mongo.Pipeline{{{"$阶段名", bson.D{{"参数", "值"}}}},// ... 更多阶段
}
cursor, err := collection.Aggregate(context.TODO(), pipeline)

🧩 常用阶段 (Stages)

这是你在开发中最常遇到的几个“工人”:

阶段 作用 SQL 类比
$match 过滤:筛选出符合条件的文档。 WHERE
$group 分组:按某字段分组并进行统计(求和、计数等)。 GROUP BY
$project 重塑:选择要显示的字段,或计算新字段。 SELECT
$sort 排序:按字段升序或降序排列。 ORDER BY
$limit 限制:只取前 N 条数据。 LIMIT
$unwind 展开:将数组字段拆分成多条文档。 (无直接对应)
$lookup 连表:关联另一个集合的数据(类似左连接)。 LEFT JOIN

💻 Go 语言实战示例

假设我们有一个名为 orders 的集合,存储了订单数据。

1. 准备数据

{ "_id": 1, "cust_id": "A", "amount": 100, "status": "A" }
{ "_id": 2, "cust_id": "B", "amount": 200, "status": "A" }
{ "_id": 3, "cust_id": "A", "amount": 50,  "status": "B" }

2. 场景一:基础统计

需求:找出所有状态为 "A" 的订单,按客户 cust_id 分组,计算每个客户的总金额,并按金额降序排列。

import ("context""fmt""log""go.mongodb.org/mongo-driver/bson""go.mongodb.org/mongo-driver/mongo"
)func aggregateExample(collection *mongo.Collection) {// 构建管道pipeline := mongo.Pipeline{// 1. $match: 过滤状态为 "A" 的订单{{"$match", bson.D{{"status", "A"}}}},// 2. $group: 按 cust_id 分组,计算总金额// _id: "$cust_id" 表示分组依据是 cust_id 字段// totalAmount: { "$sum": "$amount" } 表示累加 amount 字段{{"$group", bson.D{{"_id", "$cust_id"}, {"totalAmount", bson.D{{"$sum", "$amount"}}},}}},// 3. $sort: 按总金额降序排列 (-1 表示降序){{"$sort", bson.D{{"totalAmount", -1}}}},}// 执行聚合cursor, err := collection.Aggregate(context.TODO(), pipeline)if err != nil {log.Fatal(err)}defer cursor.Close(context.TODO())// 遍历结果var results []bson.Mif err = cursor.All(context.TODO(), &results); err != nil {log.Fatal(err)}fmt.Println("统计结果:", results)// 输出示例: [{_id:A totalAmount:100} {_id:B totalAmount:200}]
}

3. 场景二:多表关联 ($lookup)

需求:查询订单,并把订单中的 cust_id 替换为 users 集合中对应的用户详细信息。

pipeline := mongo.Pipeline{{{"$lookup", bson.D{{"from", "users"},        // 要关联的集合名{"localField", "cust_id"}, // 当前集合的字段{"foreignField", "id"},    // 关联集合的字段{"as", "userInfo"},        // 关联结果存入的新字段名}}},
}cursor, err := collection.Aggregate(context.TODO(), pipeline)
// ... 处理 cursor ...

4. 场景三:字段重塑 ($project)

需求:只返回 cust_idamount,并且把 amount 改名为 price,不显示 _id

pipeline := mongo.Pipeline{{{"$project", bson.D{{"_id", 0},             // 0 表示排除该字段{"cust_id", 1},         // 1 表示包含该字段{"price": "$amount"},   // 将 amount 的值赋给新字段 price}}},
}

💡 性能优化小贴士

  1. 尽早过滤 ($match 前置)
    尽量把 $match 阶段放在管道的最前面。这样可以尽早减少数据量,让后续的阶段处理更少的数据,极大地提升效率。

    • :先 $match 筛选出 100 条数据 -> 再 $group
    • :先 $group 统计 100万条数据 -> 再 $match
  2. 利用索引
    $match$sort 阶段是可以利用数据库索引的。确保你的查询字段上有合适的索引。

  3. 使用 AllowDiskUse
    如果聚合操作处理的数据量非常大(超过 MongoDB 默认的 100MB 内存限制),需要在执行时开启磁盘使用权限:

    opts := options.Aggregate().SetAllowDiskUse(true)
    cursor, err := collection.Aggregate(ctx, pipeline, opts)
    

聚合管道是 MongoDB 的精髓,掌握它可以让你的 Go 后端代码变得非常简洁,把复杂的计算逻辑交给数据库去处理。

http://www.jsqmd.com/news/678134/

相关文章:

  • GPU算力适配优化:Pixel Fashion Atelier双卡并发锻造性能实测
  • Windows Cleaner终极指南:如何快速释放20GB+磁盘空间并提升系统性能
  • 思源黑体TTF:构建高质量中文字体的完整解决方案
  • 第3课作业
  • 别再只会用现成字体了!手把手教你用FontCreator从零设计一套自己的英文字体
  • LeaguePrank:英雄联盟游戏界面的安全自定义终极指南
  • 强化学习算法:PPO and TRPO算法实现细节 —— Implementation Matters in Deep RL: A Case Study on PPO and TRPO
  • CAN通信避坑指南:STM32 HAL库滤波器配置与中断接收的那些细节
  • 攻击者持续一年尝试利用CVE-2023-33538漏洞但均未成功
  • 2026成都诚信打印机租赁TOP名录 企业办公文印解决方案参考 - 优质品牌商家
  • AI Agent Skill Kit:从工具调用到智能技能编排的技术演进
  • C++继承详解
  • 告别密码输入:在Windows 11上为GitHub配置SSH密钥的完整指南
  • 2026年3月优质的粘钉一体机源头厂家推荐,半自动钉箱机/半自动粘箱机/全自动钉箱机/双片钉箱机,粘钉一体机工厂有哪些 - 品牌推荐师
  • AI教材写作神器来袭!低查重保障,快速生成25万字实用教材!
  • React 实战:从零构建一个支持拖拽与边界吸附的智能悬浮组件
  • 从流水灯到双机通信:手把手教你玩转51单片机串口(附代码与电路图)
  • 基于ROS2的多功能自主作业机器人设计与实现
  • 2026年宠物买卖品牌选型逻辑及TOP5合规机构盘点 - 优质品牌商家
  • 突破网盘限速的终极方案:LinkSwift 直链下载助手深度解析
  • YOLOv5至YOLOv12升级:车牌检测系统的设计与实现(完整代码+界面+数据集项目)
  • 别再裸跑容器了!1份经37家头部云厂商联合验证的Docker沙箱基线配置(含YAML/Ansible/Terraform三版本)
  • 终极全面战争模组制作指南:Rusted PackFile Manager (RPFM) 现代化解决方案
  • 揭秘AI教材生成低查重秘诀,利用AI写教材,3天完成30万字书稿!
  • 3分钟学会完整备份QQ空间说说:GetQzonehistory终极指南
  • NCM音频解密引擎:高性能分布式转换架构深度解析
  • 信奥之路-C++第11课作业
  • xrdp实战:构建企业级Linux远程桌面服务的3个关键决策
  • 企业级舆情监测系统技术解析:Infoseek数字公关AI中台架构与实践
  • YOLOv5至YOLOv12升级:常见车型识别系统的设计与实现(完整代码+界面+数据集项目)