mongodb-聚合操作

39 阅读1分钟

聚合操作处理数据记录并返回计算结果(诸如统计平均值,求和等)。聚合操作组值来自多个文档,可以对 分组数据执行各种操作以返回单个结果。

聚合操作包含三类:单一作用聚合、聚合管道、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: "" } })

image.png