mongodb 基本操作:文档聚合

聚合操作将多份文档分组,对每个分组做一系列操作然后得到一个值。mongodb有3种聚合方式:

 

集合流水线聚合

db.orders.aggregate([
   { $match: { status: "A" } },
   { $group: { _id: "$cust_id", total: { $sum: "$amount" } } }
])

操作分两步:

  • 步骤一: $match 阶段对文档的 status 字段过滤,将 status = "A" 的文档传递给下一步.
  • 步骤二: $group 阶段以 cust_id 对文档分组,对每个 cust_id 计算 amount 总和.

 

流水线

  • mongodb 流水线由多个  stages 组成,每个阶段对文档过滤,或产生新文档或过滤掉文档
  • 不同stages 可以在流水线中出现多次,除了:$out$merge,  $geoNear

流水线表达式

  • 指定了对文档的转换操作,格式详见: document 
  • 只能访问当前操作文档的数据,不能访问其他文档;是内存的转换
  • 一般而言表达式是无状态的,除了: accumulator 表达式
  • 在group 阶段用的accumulators 表达式在文档流经他们时会维持状态( totals, maximums, minimums……)

更多详见:Expressions

聚合流水线行为

mongodb 聚合  aggregate  是对整个数据集操作,可以用以下方法避免扫描整个数据集

流水线中的索引

  • $match :出现在流水线开头可以使用索引过滤文档
  •  $sort :可以使用索引只要不在 $project$unwind, $group 之后
  •  $group :满足以下条件时可使用索引
    • 跟在$sort  之后,且$sort  的字段是group的字段
    • group 的字段有索引且与排序方式匹配
    •  $group 阶段使用的聚合操作是 $first

提前过滤

当聚合只针对部分文档时,在聚合开头使用: $match$limit, $skip

流水线聚合更多详见:

 

Map-Reduce 聚合

版本4.2加入,不建议对分片的数据集(sharded collection)做修改,以及非原子性的操作

 MongoDB 对每份文档使用 map (满足 query 条件的文档). map 函数构造cust_id - amount 的键值对 . 对于有多个值的键, MongoDB 应用 reduce , 收集统计聚合的数据值. MongoDB 将结果存放到一个数据集中 . 或者,reduce的输出流经 finalize  函数做进一步的统计.

关于MapReduce 更多详见:

 

转自:https://docs.mongodb.com/manual/aggregation/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值