美文网首页
MongoDB快速入门教程 (3.3)

MongoDB快速入门教程 (3.3)

作者: 螺钉课堂 | 来源:发表于2019-12-24 11:43 被阅读0次

    3.4.聚合

    #3.4.1.什么是聚合?

    MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的 count(*)

    image

    例如上图中一个集合中有9个文档,通过count操作后,输出一个9,这种操作就是一个单一的聚合操作

    #3.4.2.什么是聚合管道?

    上面说到了单一的聚合操作,那什么又是聚合管道呢?你可以把管道理解为流水线,或者就是水管,把数据看作是水流,我们称之为数据流,管道中装的都是数据,数据在管道中流动,数据在一个管道中经过处理后可以传递到下一个管道,最终得到你想要的数据

    请看官网例子:

    image

    在集合中有4条文档数据,经过match操作后可以匹配出status为A的数据,此时处理后的数据只剩3条,status为D的这条数据被过滤掉了,紧接着,数据进入下一个管道,此时交给group来处理,$group的作用是对文档进行分组,分组后又根据amount字段求和,所以id为A123的最终结果是750(500+250)

    #3.4.3.如何使用聚合管道操作

    #1.aggregate() 方法

    这个方法就是用来具体执行管道操作的,具体语法如下:

    db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)  
    
    

    官网例子:

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

    aggregate方法中传入一个数组,这个数据中的每个元素就是一次聚合操作,第一个元素的操作执行完后会传递给下个元素执行,每个元素都是一个对象,对象中的key就是管道操作符,例如:{match: {status: "A"}},这里面的match就是管道操作符,对象中的value值就是管道表达式,例如:{$match: {status: "A"}},这里面的{status: "A"}就是管道表达式

    #2.常用管道操作符

    管道操作符 功能描述
    $project 修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档
    $match 用于过滤数据,只输出符合条件的文档
    $limit 用来限制MongoDB聚合管道返回的文档数
    $skip 在聚合管道中跳过指定数量的文档,并返回余下的文档
    $sort 条件排序
    $group 将集合中的文档分组,可用于统计结果
    $lookup 用以引入其他集合的数据,可以用来做关联查询

    #3.管道表达式

    前面我们已经说过什么是管道表达式,例如:{_id: "cust_id", total: {sum: "amount"}},每一个管道表达式都是对象的形式,里面也包含了key和value,key通常都是字段名,value就是字段值, 字段值里面可以是由表达式操作符组成的对象,例如:{sum: "amount"},这个对象就是由表达式操作符组成的,其中,sum就是一个表达式操作符,用于求和运算

    常见的表达式操作符如下:

    表达式操作符 功能描述
    $addToSet 将文档的指定字段的值去重
    $max 求字段的最大值
    $min 求字段的最小值
    $sum 求和
    $avg 求平均值
    $gt 大于
    $lt 小于
    $eq 等于

    #4.实际操作

    准备数据,你可以将下列代码直接拷贝到mongodb中执行:

    db.order.insert({"order_id":"1","uid":10001,"trade_no":"nd001","all_price":10,"all_num":9}) 
    db.order.insert({"order_id":"2","uid":10002,"trade_no":"nd002","all_price":20,"all_num":8}) 
    db.order.insert({"order_id":"3","uid":10003,"trade_no":"nd003","all_price":30,"all_num":7})
    db.order_item.insert({"order_id":"1","title":"无线鼠标 1","price":500,num:10}) 
    db.order_item.insert({"order_id":"1","title":"无线键盘 2","price":600,num:11}) 
    db.order_item.insert({"order_id":"1","title":"有线键盘 3","price":700,num:12})
    db.order_item.insert({"order_id":"2","title":"苹果","price":50,num:2}) 
    db.order_item.insert({"order_id":"2","title":"香蕉","price":40,num:3})
    db.order_item.insert({"order_id":"3","title":"牛奶","price":20,num:9}) 
    db.order_item.insert({"order_id":"3","title":"面包","price":10,num:4})
    
    
    image
    #1.$project

    通俗的说这个管道操作符可以用来筛选指定的字段

    举例:查询出订单信息,只显示订单号

    db.order.aggregate([{$project:{_id: 0, order_id: 1}}])
    
    
    #2.$match

    通俗的说$match操作的作用就是查找满足条件的数据

    db.order.aggregate([{$project: {order_id: 1, all_price: 1}}, {$match: {"all_price": {$gt: 20}}}])
    
    
    #3.$group

    $group主要是用来进行分组操作的

    db.order_item.aggregate([{$group: {_id: "$order_id", total: {$sum: "$num"}}}])
    
    

    注意:在使用$group的时候必须有一个_id作为分组的条件

    #4.$sort

    $sort的作用是用来进行排序

    db.order_item.aggregate([{$sort: {"price": -1}}])
    
    

    注意: -1 表示降序, 1表示升序

    #5.$limit

    $limit的作用是限制显示条数

    db.order_item.aggregate([{$sort: {"price": -1}}, {$limit: 1}])
    
    
    #6.$skip

    $skip的作用是可以跳过的条数

    db.order_item.aggregate([{$sort: {"price": -1}}, {$skip: 3}])
    
    
    #7.$lookup

    $lookup用来做关联查询,举个例子:查询order表中,order_id对应的商品信息

    db.order.aggregate([{$lookup:{from: "order_item", localField: "order_id", foreignField: "order_id"
    

    相关文章

      网友评论

          本文标题:MongoDB快速入门教程 (3.3)

          本文链接:https://www.haomeiwen.com/subject/cgwxoctx.html