- MongoDB官方文档中文版
- MongoDB中文手册说明
- MongoDB简介
- 安装 MongoDB
- The mongo Shell
- MongoDB CRUD 操作
- 聚合
- 数据模型
- 事务
- 索引
- 安全
- 安全检查列表
- 启用访问控制
- 身份验证
- 基于角色的访问控制
- TLS / SSL(传输加密)
- 静态加密
- 客户端字段级加密
- 审计
- 网络和配置强化
- 实现字段级别修订
- 安全参考
- 附录
- 变更流
- 复制
- 分片
- 分片键
- 哈希分片
- 范围分片
- 区
- 管理分片区
- 按位置细分数据
- 用于更改SLA或SLO的分层硬件
- 按应用或客户细分数据
- 仅插入工作负载的分布式本地写入
- 管理分片区
- 使用块进行数据分区
- 在分片集群中拆分数据块
- 管理
- 存储
- 存储引擎
- 日志记录
- 管理日志记录
- GridFS
- FAQ:MongoDB 存储
- 存储引擎
- 参考
- 运算符
- 查询与映射运算符
- 更新运算符
- 聚合管道阶段
- 聚合管道操作符
- $abs (aggregation)
- $acos (aggregation)
- $acosh (aggregation)
- $add (aggregation)
- $addToSet (aggregation)
- $allElementsTrue (aggregation)
- $and (aggregation)
- $anyElementTrue (aggregation)
- $arrayElemAt (aggregation)
- $arrayToObject (aggregation)
- $asin (aggregation)
- $asinh (aggregation)
- $atan (aggregation)
- $atan2 (aggregation)
- $atanh (aggregation)
- $avg (aggregation)
- $ceil (aggregation)
- $cmp (aggregation)
- $concat (aggregation)
- $concatArrays (aggregation)
- $cond (aggregation)
- $convert (aggregation)
- $cos (aggregation)
- $dateFromParts (aggregation)
- $dateToParts (aggregation)
- $dateFromString (aggregation)
- $literal (aggregation)
- 查询修饰符
- 数据库命令
- 聚合命令
- 地理空间命令
- 查询和写操作命令
- 查询计划缓存命令
- 认证命令
- 用户管理命令
- 角色管理命令
- 复制命令
- 分片命令
- 会话命令
- 管理命令
- 诊断命令
- 免费监控命令
- 系统事件审计命令
- mongo Shell 方法
- 集合方法
- db.collection.aggregate()
- db.collection.bulkWrite()
- db.collection.copyTo()
- db.collection.count()
- db.collection.countDocuments()
- db.collection.estimatedDocumentCount()
- db.collection.createIndex()
- db.collection.createIndexes()
- db.collection.dataSize()
- db.collection.deleteOne()
- db.collection.deleteMany()
- db.collection.distinct()
- db.collection.drop()
- db.collection.dropIndex()
- db.collection.dropIndexes()
- db.collection.ensureIndex()
- db.collection.explain()
- db.collection.find()
- db.collection.findAndModify()
- db.collection.findOne()
- db.collection.findOneAndDelete()
- db.collection.findOneAndReplace()
- db.collection.findOneAndUpdate()
- db.collection.getIndexes()
- db.collection.getShardDistribution()
- db.collection.getShardVersion()
- db.collection.insert()
- db.collection.insertOne()
- db.collection.insertMany()
- db.collection.isCapped()
- db.collection.latencyStats()
- db.collection.mapReduce()
- db.collection.reIndex()
- db.collection.remove()
- db.collection.renameCollection()
- db.collection.replaceOne()
- db.collection.save()
- db.collection.stats()
- db.collection.storageSize()
- db.collection.totalIndexSize()
- db.collection.totalSize()
- db.collection.update()
- db.collection.updateOne()
- db.collection.updateMany()
- db.collection.watch()
- db.collection.validate()
- 词汇表
- 默认的MongoDB端口
- 默认的MongoDB读/写关注
- 服务器会话
- MongoDB驱动
- FAQ
- 联系我们
- 更多资料
- [快学Mongo]
- [Mongo问题讨论区]
- [Mongo 驱动使用手册]
- 本书使用 GitBook 发布
聚合管道
聚合管道
在本页面
聚合管道是用于数据聚合的框架,其模型基于数据处理管道的概念。文档进入多阶段管道,将文档转换为聚合结果。例如: 在这个例子中
db.orders.aggregate([
{ $match: { status: "A" } },
{ $group: { _id: "$cust_id", total: { $sum: "$amount" } } }
])
第一阶段:$match
阶段按status
字段过滤文档,并将status
等于"A"
的文档传递到下一阶段。
第二阶段:$group
阶段按cust_id
字段将文档分组,以计算每个cust_id
唯一值的金额总和。
管道
MongoDB 聚合管道由多个阶段组成。每个阶段在文档通过管道时转换文档。管道阶段不需要为每个输入文档生成一个输出文档; 如:某些阶段可能会生成新文档或过滤掉文档。
Pipeline阶段可以与外管道出现多次$out
,$merge
和 $geoNear
阶段。有关所有可用阶段的列表,请参见 聚合管道阶段。
MongoDB 在mongo shell 中提供db.collection.aggregate()方法,在聚合管道中提供聚合命令。
对于聚合管道的 example 用法,请考虑使用用户首选项数据进行聚合和使用 Zip Code 数据集进行聚合。
从MongoDB 4.2开始,您可以使用聚合管道在以下位置进行更新:
[success] 也可以看看
管道表达式
某些管道阶段将管道表达式作为操作数。管道表达式指定要应用于输入文档的转换。表达式具有文档结构,可以包含其他表达式。
管道表达式只能对管道中的当前文档进行操作,并且不能引用其他文档中的数据:表达式操作提供文档的内存转换。
通常,表达式是无状态的,只有在聚合过程看到表达式时才计算,只有一个例外:累加器表达式。
在$group阶段中使用的累加器在记录管道中的进程时维护它们的状态(如: 总计,最大值,最小值和相关数据)。
Mongodb 3.2的变化:$project阶段有一些累加器可用;但是,在$project阶段使用时,累加器不会跨文档维护它们的状态。
有关表达式的更多信息,请参阅表达式。
聚合管道行为
在 MongoDB 中,管道命令在单个集合上运行,从逻辑上将整个集合传递到聚合管道。为了尽可能优化操作,请使用以下策略以避免扫描整个集合。
管道运算符和索引
MongoDB的query planner分析聚合管道,以确定是否可以使用索引来改善管道性能。例如,以下管道阶段可以利用索引:
[success] 注意
以下管道阶段并不代表可以使用索引的所有阶段的完整列表。
- $match
如果$match
阶段出现在管道的开始,该阶段可以使用索引来过滤文档。
- $sort
只要前面没有$project
,$unwind
或 $group
阶段,$sort
阶段可以使用索引。
- $group
如果满足下列所有的条件,$group
阶段有时可以使用的索引来查找每一个组中的第一文档:
$group
阶段之前是一个$sort
阶段,该阶段对字段进行分组- 在分组的字段上有一个索引,它与排序顺序匹配
$group
阶段中使用的唯一累加器是$first
有关示例,请参见优化以返回每个组的第一个文档。
- $geoNear
$geoNear
管道运算符利用地理空间索引。在使用时$geoNear
, $geoNear
管道操作必须出现在聚合管道的第一阶段出现。
Mongodb 3.2 版本的改变:从MongoDB 3.2开始,索引可以覆盖聚合管道。在MongoDB 2.6和3.0中,索引无法覆盖聚合管道,因为即使管道使用索引,聚合仍需要访问实际文档。
早期过滤
如果聚合操作仅需要集合中的数据子集,请使用$match,$limit和$skip阶段来限制在管道开头输入的文档。当放置在管道的开头时,$match操作使用合适的索引来仅扫描集合中的匹配文档。
在管道的开头放置$match管道阶段后跟$sort阶段在逻辑上等同于具有排序的单个查询并且可以使用索引。如果可能,将$match 操作符放在管道的开头。
附加功能
聚合管道具有内部优化阶段,为 operators 的某些序列提供改进的 performance。有关详细信息,请参阅聚合管道优化。
聚合管道支持对分片集合的操作。见聚合管道和分片集合。
注意事项
分片集合
聚合管道支持对分片集合的操作。请参阅聚合管道和分片集合。
聚合管道与Map-Reduce的比较
聚合管道为map-reduce提供了一种替代方案,并且对于map-reduce的复杂性可能没有保障的聚合任务,它可能是首选的解决方案。
限制
聚合管道对值类型和结果大小有一些限制。有关聚合管道的限制和限制的详细信息,请参见聚合管道限制。
管道优化
管道优化聚合管道具有内部优化阶段,可为某些操作符序列提供改进的性能。有关详细信息,请参阅聚合管道优化。
译者:李冠飞 刘翔
校对:李冠飞
Copyright © 上海锦木信息技术有限公司 all right reserved,由 MongoDB汉化小组 提供技术支持文件修订时间: 2020-10-11 20:53:05