美文网首页mongoDBWeb前端之路程序员
【mongoDB查询进阶】聚合管道(四) -- 累加器(Accu

【mongoDB查询进阶】聚合管道(四) -- 累加器(Accu

作者: n_ll | 来源:发表于2017-08-31 12:32 被阅读120次

    回顾

    相关文章回顾

    mongoDB查询进阶--聚合管道(一)回顾
    mongoDB查询进阶--聚合管道(二)回顾
    mongoDB查询进阶--聚合管道(三)回顾

    管道操作符的分类

    管道操作符可以分为三类:

    1. 阶段操作符(Stage Operators)
    2. 表达式操作符(Expression Operators)
    3. 累加器(Accumulators)

    参考MongoDB官网:https://docs.mongodb.com/manual/reference/operator/aggregation

    本篇主要内容是管道操作符中的累加器。

    累加器(Accumulators)

    累加器本来只能使用与$groud下,但是版本3.2或以上,部分累加器还能使用于$project。当在$group中使用时,累加器是针对每个分组使用的;当在$project中使用时,累加器则是针对每个字面量起作用。

    常用累加器

    操作符 简述
    $sum 求和操作符,v3.2+可以用于$group或是$poject
    $avg 求均值操作符,v3.2+可以用于$group或是$poject
    $first 用于返回分组的第一个值,只能用于$group
    $last 用于返回分组的最后一个值,只能用于$group
    $max 用于返回分组的最大值,v3.2+可以用于$group或是$poject
    $min 用于返回分组的最小值,v3.2+可以用于$group或是$poject

    $sum 求和操作符

    用法:

    • $group下使用
    { $sum: <expression> }
    
    • $project下使用:
    { $sum: <expression> }
        or
    { $sum: [ <expression1>, <expression2> ... ]  }
    
    

    说明:

    列子 结果
    { $sum : <field> } 只含数字 所有值的和
    { $sum : <field> } 含数字和非数字 所有数字值的和
    { $sum : <field> } 非数字或不存在 0

    举例:

    请看后面的综合示例

    $avg 求均值操作符

    用法:

    • $group下使用
    { $avg: <expression> }
    
    • $project下使用:
    { $avg: <expression> }
        or
    { $avg: [ <expression1>, <expression2> ... ]  }
    

    举例:

    请看后面的综合示例

    $first 求第一值操作符

    用法:

    { $first: <expression> }
    

    举例:
    假设数据:

    [
        { _id: 1, name: 'kate', class: 'a' },
        { _id: 2, name: 'jack', class: 'a' },
        { _id: 3, name: 'kent', class: 'b' },
    ]
    

    操作:

    db.collection.aggregate(
       [
         {
           $group:
             {
               _id: "$class",
               firstPersonName: { $first: "$name" }
             }
         }
       ]
    )
    

    结果:

    [
        { _id: 'a', firstPersonName: 'kate' },
        { _id: 'b', firstPersonName: 'kent' },
    ]
    

    $last 求最后值操作符

    用法:

    { $last: <expression> }
    

    举例:
    假设数据:

    [
        { _id: 1, name: 'kate', class: 'a' },
        { _id: 2, name: 'jack', class: 'a' },
        { _id: 3, name: 'kent', class: 'b' },
    ]
    

    操作:

    db.collection.aggregate(
       [
         {
           $group:
             {
               _id: "$class",
               firstPersonName: { $last: "$name" }
             }
         }
       ]
    )
    

    结果:

    [
        { _id: 'a', firstPersonName: 'jack' },
        { _id: 'b', firstPersonName: 'kent' },
    ]
    

    $max 求最大值操作符

    用法:

    • $group下使用
    { $max: <expression> }
    
    • $project下使用:
    { $max: <expression> }
        or
    { $max: [ <expression1>, <expression2> ... ]  }
    

    举例:

    请看后面的综合示例

    $min 求最小值操作符

    用法:

    • $group下使用
    { $min: <expression> }
    
    • $project下使用:
    { $min: <expression> }
        or
    { $min: [ <expression1>, <expression2> ... ]  }
    

    举例:

    请看后面的综合示例

    综合示例

    假设有一个关于成绩的集合

    [
        { _id: 1, name: 'kate', score: 80, class: 'a', subject: 'A' },
        { _id: 2, name: 'kate', score: 60, class: 'a', subject: 'B' },
        { _id: 3, name: 'jack', score: 90, class: 'a', subject: 'A' },
        { _id: 4, name: 'jack', score: 60, class: 'a', subject: 'B' },
        { _id: 5, name: 'nick', score: 80, class: 'b', subject: 'A' },
        { _id: 6, name: 'nick', score: 90, class: 'b', subject: 'B' },
        { _id: 7, name: 'kent', score: 50, class: 'b', subject: 'A' },
        { _id: 7, name: 'kent', score: 30, class: 'b', subject: 'B' },
    ]
    

    示例一

    需求:

    • 获取各科目的最高分
    • 获取各科目的最低分
    • 获取各科目的平均分

    操作:

    db.collection.aggregate(
       [
         {
           $group:
             {
               _id: "$subject",
               maxScore: { $max: '$score' },
               minScore: { $min: '$score' },
               avgScore: { $avg: '$score' },
             }
         }
       ]
    )
    

    结果:

    [
        { _id: 'A', maxScore: 90, minScore: 50, avgScore: 75 },
        { _id: 'B', maxScore: 90, minScore: 30, avgScore: 60 },
    ]
    

    示例二

    需求:

    • 获取每人的总分
    • 从高到低排序

    操作:

    db.collection.aggregate(
       [
         {
           $group:
             {
               _id: "$name",
               totalScore: { $sum: '$score' }
             }
         },
         {
            $sort: { totalScore: -1 } 
         },
         {
            $project: {
                _id: 0,
                name: '$_id',
                totalScore: 1,
            }
         }
       ]
    )
    

    结果:

    [
        { name: 'nick', totalScore: 170 },
        { name: 'jack', totalScore: 150 },
        { name: 'kate', totalScore: 140 },
        { name: 'kent', totalScore: 80 }
    ]
    

    感谢阅读~

    相关文章

      网友评论

        本文标题:【mongoDB查询进阶】聚合管道(四) -- 累加器(Accu

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