美文网首页mongodb
MongoDB 实用数组聚合操作 (1)

MongoDB 实用数组聚合操作 (1)

作者: 岛上码农 | 来源:发表于2022-05-31 19:02 被阅读0次

    上一篇MongoDB 轻松搞定统计 —— 聚合函数使用介绍了使用 MongoDB 的基本聚合方法进行基本的统计。接下来分三篇介绍对数组的常用操作。

    测试数据准备

    准备如下测试数据:

    db.employees.insert({"name":"岛上码农","dept":"研发部","languages":["Dart","Java","Javascript"]
    ,"age":30, "totalExp":10});
    db.employees.insert({"name":"Amy","dept":"研发部","languages":["Java","Go"],"age":35,
    "totalExp":11});
    db.employees.insert({"name":"Bob","dept":"测试部","languages":["Java","Javascript"],"age":36,
    "totalExp":14});
    db.employees.insert({"name":"Cathy","dept":"研发部","languages":["Javascript", "Python"],"age":30,
    "totalExp":4});
    db.employees.insert({"name":"Mike","dept":"测试部","languages":["Java", "Python",
    "Go"],"age":26, "totalExp":3});
    db.employees.insert({"name":"Jenny","dept":"研发部","languages":["Java", "Javascipt",
    "Dart"],"age":26, "totalExp":3});
    
    

    $match匹配查找

    使用$match 操作符可以按指定字段匹配数据,类似 SQL 的 WHERE 条件,例如查找部门是研发部的员工。

    # 单条件匹配
    db.employees.aggregate([{$match: {dept: '研发部'}}]);
    # 多条件匹配
    db.employees.aggregate([{$match: {dept: '研发部'}},{$match: {age: 35}}]);
    

    $project字段筛选

    使用$project 操作符可以指定返回哪些字段,其中标记为1的返回,未标记或为0的不返回,但_id 默认返回,除非显示指定不返回_id。

    # 只返回_id,name和 dept 字段
    db.employees.aggregate({$project: {'name': 1, 'dept': 1}});
    # 只返回name和 dept 字段
    db.employees.aggregate({$project: {'_id': 0, 'name': 1, 'dept': 1}});
    # $match 和$project 组合使用
    db.employees.aggregate([{$match: {dept: '研发部'}},{$project: {'name': 1, 'dept': 1}}]);
    

    $group 分组

    $group 用于按指定的字段进行分组,如果指定的字段为 null,那就是只分一个组。可以用$group 做分组统计,参考上一篇。

    # 部门分组信息
    db.employees.aggregate([{$group: {'_id': '$dept'}}]);
    

    $sum 求和和取平均

    这个在上一篇介绍过了,$sum 可以对指定字段进行求和,$avg 用于取平均值。例如求每个部门的员工数及平均工作年数:

    db.employees.aggregate([
        {
        $group: {
            '_id': '$dept', 
          'numOfEmployee': {$sum: 1}, 
          'avgExp':{$avg: '$totalExp'}
         }
       }
    ]);
    

    最大最小值

    使用$max$min可以对指定的字段求最小值。

    # 求全部员工中的最小和最大年龄
    db.employees.aggregate(
        [
        {$group: {
            '_id': null, 
          'minAge': {$min: '$age'},
          'maxAge': {$max: '$age'}
         }
       }
      ]
    );
    

    首尾元素获取

    对于有序元素来说这个非常有用,可以从首尾获取需要的数据。

    db.employees.aggregate(
        [
        {
            $group: {
            '_id': '$dept',
            'last': {$last: '$name'},
            'first': {$first: '$name'}
          }
        }
      ]
    );
    

    数据汇总到数组和集合

    在分组时使用$push 可以将一个指定的字段元素加入到数组中,而使用 $addToSet 则会加入到集合中。二者的区别在于集合元素不可重复。

    db.employees.aggregate(
        [
        {
            $group: {
            '_id': null, 
            'arrayPush': {$push: '$age'},
            'arraySet': {$addToSet: '$age'}
          }
        }
      ]
    );
    

    小结

    本篇以示例的方式列举了 MongoDB 内置的部分聚合数据的方式,可以看到,MongoDB 提供了很多原先需要通过代码完成的聚合工作,可以简化应用程序的开发。下一篇我们将介绍更多实用的聚合操作。

    相关文章

      网友评论

        本文标题:MongoDB 实用数组聚合操作 (1)

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