MongoDB 聚合操作及索引

聚合操作

  • 单一聚合
  • 管道聚合,流水线操作
  • MapReduce(弃用)

单一聚合

方法 说明
count() 统计,等同于 find(query).count()
distinct() 查找字段不同值
estimatedDocumentCount() 所有文档计数

管道聚合

什么是聚合框架

  • 作用在一个或几个集合上
  • 对集合进行系列运算
  • 将数据转化为期望值

管道 (Pipeline) 和阶段 (Stage)

聚合运算过程称为管道,有多阶段组成

1
2
pipeline = [$stage1,$stage2];
db.collection.aggregate(pipeline, {options})
$project

** 投影 **,取别名

1
db.books.aggregate([{$project:{name:"$title"}}]) // title-> name
$match

** 筛选 **,尽可能放前面

1
2
3
4
db.books.aggregate([
{$match:{type:"technole"}},
{$project:{name:"$title"}}
])
$count

** 统计 **,放入对应的字段中

1
2
3
4
db.books.aggregate([
{$match:{type:"technole"}},
{$count:"count_number"} // 放入 count_number 字段中
])
$group

** 分组 **,并将结果集输出至下一阶段

1
2
3
{$group : {_id : <expression>, <field1> : { <accumulator1> : <expression1>}}}
// _id : <expression> 为分组的字段,如果为 null 则没有分组直接统计
// 单字段,_id:{name:"$author.name"}, 多字段, _id:{name:"$author.name",title:"$title"}
$unwind

** 拆分 **,将数组拆分为单独文档

$limit
$skip
$sort
$lookup

左连接

索引

MongoDB 索引数据结构