聚合操作处理数据记录并返回计算结果(诸如统计平均值,求和等)。聚合操作组值来自多个文档,可以对 分组数据执行各种操作以返回单个结果。
聚合操作包含三类:单一作用聚合、聚合管道、MapReduce。
单一作用聚合:提供了对常见聚合过程的简单访问,操作都从单个集合聚合文档。 聚合管道是一个数据聚合的框架,模型基于数据处理流水线的概念。文档进入多级管道,将文档转 换为聚合结果。 MapReduce操作具有两个阶段:处理每个文档并向每个输入文档发射一个或多个对象的map阶 段,以及reduce组合map操作的输出阶段。
1.1 单一作用聚合
db.collection.estimatedDocumentCount(),
查询集合数量:db.books.count()
db.books.find().count()
忽略查询条件: db.collection.estimatedDocumentCount()
去重:db.books.distinct("type")
1.2管道集合
$project 投影操作,将原始字段投影成指定名称
如将集合中的 title 投影成 namedb.books.aggregate([{$project:{name:"$title"}}])
控制字段显示:db.books.aggregate([{$project:{name:"$title",_id:0,type:1,author:1}}])
$match 用于对文档进行筛选,之后可以在得到的文档子集上做聚合
显示type为technology:db.books.aggregate([{$match:{type:"technology"}}])
$count 计数并返回与查询匹配的结果数
匹配完进行求和:db.books.aggregate([ {$match:{type:"technology"}}, {$count: "type_count"}])
$group 按指定的表达式对文档进行分组,并将每个不同分组的文档输出到下一个阶段。
公式:{ $group: { _id: <expression>, <field1>: { <accumulator1> : <expression1> }, ... } }
book的数量,收藏总数和平均值:db.books.aggregate([ {$group:{_id:null,count:{$sum:1},pop:{$sum:"$favCount"},avg: {$avg:"$favCount"}}} ])
计每个作者的book收藏总数:db.books.aggregate([ {$group:{_id:"$author.name",pop:{$sum:"$favCount"}}} ])
$unwind:可以将数组拆分为单独的文档
姓名为xx006的作者的book的tag数组拆分为多个文档:db.books.aggregate([{$match:{"author.name":"xx006"}},{$unwind:"$tag"}])
**$limit **限制传递到管道中下一阶段的文档数
db.books.aggregate([ {$limit : 5 } ])
$sort 对所有输入文档进行排序,并按排序顺序将它们返回到管道
要对字段进行排序,请将排序顺序设置为1或-1,以分别指定升序或降序排序 db.books.aggregate([ {$sort : {favCount:-1,title:1}} ])
$lookup:主要用来实现多表关联查询, 相当关系型数据库中多表关联查询
格式:
db.collection.aggregate([{ $lookup: { from: "", localField: "", foreignField: "", as: "" } })